Optional와 OptionalInt 최종 연산의 결과 타입이 Optional인 경우가 있다. Optional는 지네릭 클래스로 'T타입의 객체'를 감싸는 래퍼 클래스이다. 이 메서드는 최종 연산의 결과를 그냥 반환하는 게 아니라 Optional객체에 담아서 반환하는 것이다. 이처럼 객체에 담아서 반환을 하면, 반환된 결과를 매번 if로 체크하는 대신 Optional에 정의된 메서드를 통해서 간단히 처리할 수 있다. 널 체크를 위한 if문 없이 NullPointerException이 발생하지 않는 보다 간결하고 안전한 코드를 작성하는 것이 가능해진다. Optional객체 생성 of() 또는 ofNullable()을 사용해 Optional객체를 생성한다. 참조변수의 값이 null일 가능성이 있으면 ofN..
스트림이란? 컬렉션이나 배열에 데이터를 담고 원하는 결과를 얻을때 for문이나 iterator를 이용해왔다. 이러한 방식은 가독성과 재사용성이 떨어진다. 스트림은 이러한 문제를 해결하면서 데이터소스를 추상화하고 데이터를 다루는데 자주 사용되는 메서드들을 정의해놓았다. 예를 들어, 문자열 배열과 같은 내용의 문자열을 저장하는 List가 있을때, String[] strArr = { "aaa", "bbb", "ccc" }; List
람다식이란? 메서드를 하나의 '식(expression)'으로 표현한 것, 메서드를 람다식으로 표현하면 '익명함수(anonymous function)' int[] arr = new int[5]; Arrays.setAll(arr, (i) -> (int)(Math.random()*5)+1); 위 람다식을 풀어보면 아래와 같다. int method(){ return ( int)(Math.random()*5)+1); } 람다식 작성하기 람다식은 '익명 함수'답게 메서드 이름에서 이름과 반환타입을 제거하고 매개변수 선언부와 몸통 사이에 '->'를 추가한다. 반환타입 메서드이름 (매개변수) { //실행문 } (매개변수) -> { //실행문 } int max(int a, int b) { return a > b ? a ..
fork & join 프레임웍 이 프레임 웍을 사용하면 하나의 작업을 작은 다위로 나눠서 여러 쓰레드가 동시에 처리하는 것을 쉽게 만들어준다(병렬) RecursiveAction : 반환값이 없는 작업을 구현할 때 사용 RecursiveTask : 반환값이 있는 작업을 구현할 때 사용 먼저 수행할 작업에 따라 RecursiveAction과 RecursiveTask, 두 클래스 중 하나를 상속 받는다. coumpute()라는 추상메서드를 구현한다. 그 다음 쓰레드 풀과 수행할 작업을 생성하고, invoke()로 작업을 시작한다. 여기서 compute()를 사용하지 않는 이유는 run()을 사용하지않고 start()를 사용하는 이유와 같다. ForkJoinPool pool = new ForkJoinPool()..