본문 바로가기

Language/Java52

[Java] 자바 스트림(stream) 사용법 3 - 최종 연산 forEach() 스트림 내 요소를 매개변수 내용을 실행. void forEach(Comsumer 2022. 3. 16.
[Java] 자바 스트림(stream) 사용법 2 - 스트림의 중간연산, Optional 스트림 자르기 - skip(), limit() skip(n)은 n만큼 요소를 건너뛰는 것이고, limit(n)은 n만큼 요소의 개수를 제한한다. IntStream intStream = IntStream.rangeClosed(1,10); // 1~10의 요소를 가진 스트림 intStream.skip(3).limit(5).forEach(System.out::print); // 1,2,3건너뛰고 4~8까지 5개 출력 스트림 요소 걸러내기 -filter(), distinct() distinct()는 스트림에서 중복된 요소들을 제거하고, filter()는 주어진 조건에 맞지 않는 요소를 걸러낸다. IntStream int Stream = IntStream.of(1,2,2,3,3,3,4,5,6); intStream.. 2022. 3. 16.
[Java] 자바 스트림(stream) 사용법 1 - 특징과 생성 스트림이란 스트림은 자바 8에 추가된 데이터 소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메서드들을 정의해놓은 기술이다. 스트림을 사용하면 코드가 간결해지고 이해하기 쉽고, 재사용성이 높아진다. // 서로 다른 타입의 데이터 소스 String[] strArr = {"arr", "ddd", "ccc" }; List strList = Arrays.asList(strArr); //정렬 출력 기존 방식 Arrays.sort(strArr); for(String str: strArr){ System.out.println(str); } Collcections.sort(strList); for(String str: strList){ System.out.println(str); } // 스트림 방식 Stream 2022. 3. 16.
[Java] 람다식(Lambda expression)과 함수형 인터페이스(Functional Interface) 람다식이란 람다식은 메서드를 하나의 '식(expression)'으로 표현한 것이다. 메서드를 람다식으로 표현하면 메서드의 이름과 반환타입이 없어지므로, '익명함수(anonymous function)'이라고도 한다. int[] arr = new int[5]; Arrays.setAll(arr ,(i) -> (int)(Math.random()*5) +1); 위의 문장에서, () -> (int)(Math.random()*5) +1); 부분이 람다식이다. 이러한 람다식을 통해 보다 간결하고 이해하기 쉬워졌고, 메서드를 변수처럼 다루는 것이 가능해진다. 람다식 작성하기 반환타입 메서드이름 (매개변수 선언){ 문장들 } // 람다 (매개변수 선언) -> { 문장들 } 반환 타입과 메서드이름을 없애고, 매개변수가 수행.. 2022. 3. 16.
[Java] 쓰레드 8 - fork & join 프레임 워크 fork & join 프레임워크 이 프레임워크는 멀티쓰레드 프로그래밍을 구현하기 위해 하나의 작업을 작은 단위로 나눠서 여러 쓰레드가 동시에 처리하는 것을 쉽게 만들어준다. 수행할 작업에 따라 아래의 두 클래스 중에서 하나를 상속받아 구현한다. RecursiveAction : 반환값이 없는 작업을 구현할 때 사용 RecursiveTask : 반환값이 있는 작업을 구현할 때 사용 두 클래스 모두 compute()라는 추상 메서드를 가지고 있고, 이 추상 메서드를 구현하면 된다. 1) compute()에 작업을 수행하기 위한 코드 넣기 2) 쓰레드풀과 수행할 작업 생성 3) invoke()로 작업 시작. 쓰레드풀은 지정된 수의 쓰레드를 생성해서 미리 만들어 놓고 반복해서 재사용할 수 있게 한다. 쓰레드를 반.. 2022. 3. 14.
[Java] 쓰레드 7 - volatile volatile 코어는 메모리에서 읽어온 값을 캐시에 저장하고 캐시에서 값을 읽어서 작업한다. 다시 같은 값을 읽어올 때는 먼저 캐시에 있는지 확인하고 없을 때만 메모리에서 읽어온다. 그러다보니 도중에 메모리에 저장된 변수의 값이 변경되었는데도 캐시에 저장된 값이 갱신되지 않아서 메모리에 저장된 값이 다른 경우가 발생한다. 그럴 때 변수 앞에 volatile을 붙이면, 코어가 변수의 값을 읽어올 때 캐시가 아닌 메모리에서 읽어온다. boolean suspended = false; // volatile volatile boolean suspended = false; volatile을 붙이는 대신에 synchronized블럭을 사용해도 같은 효과를 얻을 수 있다. 쓰레드가 블럭에 들어갈 때와 나올 때, 캐시.. 2022. 3. 14.
[Java] 쓰레드 6 - 쓰레드 동기화(synchronized , Lock, Condition) 쓰레드의 동기화 멀티쓰레드 프로세스의 경우 여러 쓰레드가 자원을 공유해서 작업하기 때문에 서로에게 영향을 줄 수 있다. 이러한 일을 방지하기 위해 한 쓰레드가 진행중인 작업을 다른 쓰레드가 간섭하지 못하도록 막는 것을 '쓰레드 동기화(Synchronization)'라고 한다. synchronized를 이용한 동기화 // 1. 메서드 전체를 임계 영역으로 지정 public synchronized void calcSum(){ // ... } // 2. 특정 영역을 임계 영역으로 지정 synchronized(객체의 참조변수){ // ... } 임계영역이란 둘 이상의 프로세스(쓰레드)가 공유 데이터에 접근하여 작업하는 코드 블록. 2022.01.05 - [CS/OS(운영체제)] - 동기화 툴(프로세스 동기화) .. 2022. 3. 14.
[Java] 쓰레드 5 - 쓰레드의 실행제어(sleep, interrupt, join, yield) 쓰레드의 스케줄링 관련 메서드 메서드 설 명 static void sleep(long millis) static void sleep(long millis, int nanos) 지정된 시간(천분의 1초 단위)동안 쓰레드를 일시정지시킨다. 지정한 시간이 지나고 나면, 자동적으로 다시 실행대기상태가 된다. void join() void join(long millis) void join(long millis, int nanos) 지정된 시간동안 쓰레드가 실행되도록 한다. 지정된 시간이 지나거나 작업이 종료되면 join()을 호출한 쓰레드로 다시 돌아와 실행을 계속한다. void interrupt() sleep()이나 join()에 의해 일시정지상태인 쓰레드를 깨워서 실행대기상태로 만든다. 해당 쓰레드에서는 In.. 2022. 3. 14.