Java 8 methods
Java 8에서 추가된 기능
Stream
스트림은 데이터를 저장하지 않고, 일련의 연산을 통해 데이터를 처리하는 추상화된 개념입니다. 이를 통해 대량의 데이터를 간결하고 효율적으로 처리할 수 있습니다.
특징
선언적 방식: 스트림 API는 선언적 방식으로 데이터를 처리합니다. 즉, 무엇을 할 것인지에 집중할 수 있게 해줍니다.
데이터 변경 없음: 스트림을 사용한 데이터 처리 과정에서 원본 데이터를 변경하지 않습니다.
지연 연산: 스트림 연산은 기본적으로 지연(Lazy) 연산으로, 실제로 필요한 시점에 연산이 수행됩니다.
병렬 처리: 쉽게 병렬 스트림을 생성하여 병렬 처리를 구현할 수 있습니다.
종류
스트림은 크게 **시퀀셜 스트림(Sequential Stream)**과 **병렬 스트림(Parallel Stream)**으로 나뉩니다.
시퀀셜 스트림: 스트림의 연산이 순차적으로 처리됩니다.
병렬 스트림: 스트림의 연산이 여러 스레드에서 병렬로 처리됩니다. 이는 대용량 데이터 처리에 유용하지만, 항상 병렬 스트림이 성능을 개선하는 것은 아닙니다. 데이터의 크기, 연산의 복잡성 등에 따라 오히려 성능이 저하될 수 있습니다.
Lambda
람다 표현식은 Java 8에서 도입된 함수형 프로그래밍의 핵심 기능 중 하나입니다. 람다 표현식을 사용하면 익명 함수를 간단하게 표현할 수 있으며, 코드의 간결성과 가독성을 높여줍니다.
함수형 인터페이스
람다 표현식은 함수형 인터페이스를 구현하는 데 주로 사용됩니다. 함수형 인터페이스는 하나의 추상 메서드만을 가지는 인터페이스로, Java 8에서는 이 인터페이스들에 @FunctionalInterface
애너테이션을 붙여 명시적으로 표현할 수 있습니다.
기본 제공 함수형 인터페이스
Predicate<T>
:T
타입의 값을 입력받아boolean
을 반환합니다.Function<T, R>
:T
타입의 값을 받아R
타입의 값을 반환합니다.Supplier<T>
: 인자를 받지 않고T
타입의 값을 반환합니다.Consumer<T>
:T
타입의 값을 받아 어떤 동작을 수행하고 반환 값은 없습니다.
Default
이전 버전의 Java에서는 인터페이스에 메서드를 추가할 경우, 그 인터페이스를 구현하는 모든 클래스에서 해당 메서드를 구현해야 했습니다. 하지만 디폴트 메서드를 사용하면 인터페이스에 메서드를 추가하더라도 구현 클래스에서 해당 메서드를 구현할 필요가 없습니다.
디폴트의 단점
다이아몬드 문제(Diamond Problem): 디폴트 메서드를 사용할 때, 다중 상속 구조에서 다이아몬드 문제가 발생할 수 있다. 이는 인터페이스들이 동일한 디폴트 메서드를 제공할 때 발생하며, 이 경우에는 구현 클래스에서 메서드를 오버라이드하여 해결해야 한다.
혼란을 유발할 수 있음: 디폴트 메서드는 인터페이스의 모든 구현체에서 동일하게 동작해야 한다. 만약 기본 구현이 모든 상황에 적합하지 않다면, 이를 오버라이드해야 할 수도 있다. 이 과정에서 오버라이드할 필요가 있는지 혼란스러울 수 있다.
인터페이스의 일관성: 인터페이스는 기본적으로 동작을 정의하는 것이 아니라, 동작을 명시하는 역할을 해야 한다. 디폴트 메서드는 이러한 인터페이스의 일관성을 무너뜨릴 수 있다. 따라서 디폴트 메서드를 추가할 때는 이 메서드가 정말로 모든 구현체에 적합한지 신중하게 고려해야 한다.
다이아몬드 문제
여러 인터페이스를 구현하는 클래스에서 같은 이름의 디폴트 메서드를 상속받을 때 문제가 발생할 수 있습니다. 이를 다이아몬드 문제(Diamond Problem)라고 부릅니다.
Completable Future
비동기 프로그래밍은 처음 자바5에 Future가 추가되면서 가능하게 되었고, 이것을 통해 비동기 작업에 대한 결과값을 반환받을 수 있게 됐습니다. Future에는 단점들이 존재했는데, 단점들을 해결하고자 나온게 자바8에서 CompletableFuture입니다.
Future의단점
외부에서 작업을 중단시키는 기능을 지원하지 않음 (제어 불가) 비동기 작업이 무한루프나 오래걸릴경우, 강제로 완료 시킬 수가 없습니다.
완전한 비동기 작업이 아닙니다.
Future
는 비동기 작업이지만, 결과를 처리하기 위해서는 동기화된 블로킹 코드(’get’)로 돌아가야 합니다.여러
Future
를 조합할 수 없습니다. (예: 회원 정보를 가져오는 작업과 알림을 발송하는 작업을 조합하려면 각Future
의 결과를 순차적으로 처리해야 하며, 이를 효율적으로 조합할 수 있는 메커니즘이 없습니다.)예외처리가 어렵습니다. 예: 첫번째 작업의 성공 유무에 따른 두번쨰 작업 실행 방향 처리 구현이 어렵습니다.
CompletableFuture의 장점
유연성: 여러 비동기 작업을 유연하게 조합할 수 있습니다.
비동기 예외 처리: 예외 처리를 더욱 간단하게 할 수 있습니다.
명시적인 비동기 API: 비동기 작업의 흐름을 명확하게 표현할 수 있습니다.
병렬 실행 지원: 여러 비동기 작업을 병렬로 실행하여 성능을 향상시킬 수 있습니다.
Optional
Optional
은 값이 있을 수도 있고 없을 수도 있는 객체를 감싸는 컨테이너 클래스입니다.
특징
명시적 Null 처리:
Optional
을 사용하면null
반환 가능성을 명시적으로 나타낼 수 있습니다.널 참조 방지:
Optional
메서드를 통해 안전한null
참조를 보장합니다.간결한 코드: 반복적인
null
체크를 줄이고, 더 간결하고 가독성 높은 코드를 작성할 수 있습니다.
Optional 생성
Optional 값 다루기
Optional + Stream
Last updated