본문 바로가기
728x90

JAVA77

item 48. 스트림 병렬화는 주의해서 적용해라 자바 5부터는 동시성 컬렉션인 java.util.concurrent 라이브러리와 실행자(Executor) 프레임워크를 지원했다. 자바 7부터는 고성능 병렬 분해 프레임워크인 포크-조인 패키지를 추가했다. 포크조인(ForkJoin) 프레임워크는 병렬 처리를 위한 모델이고 분할 정복 알고리즘을 통해서 재귀적으로 처리 자바 8부터는 parallel 메서드만 한 번 호출하면 파이프라인을 병렬 실행할 수 있는 스트림을 지원했다. 병렬 스트림은 요소들을 병렬 처리하기 위해 포크조인(ForkJoin) 프레임워크를 사용 이처럼 자바로 동시성 프로그램을 작성하기가 점점 쉬워지고는 있지만, 이를 올바르고 빠르게 작성하는 일은 여전히 어려운 작업이다. 스트림 병렬화의 문제점. 데이터 소스가 Stream.iterate거나 중.. 2022. 7. 2.
item 47. 반환 타입으로는 스트림보다 컬렉션이 낫다 자바는 7까지 원소 시퀀스(일련의 원소)를 반환하는 메서드의 반환 타입으로 Collection, List, Set 등의 컬렉션 인터페이스나 Iterable 배열을 사용했다. 기본은 Collection 인터페이스다. forEach에서만 쓰이거나, contains같은 일부 collection 메소드를 구현할 수 없을 때는 Iterable을 썼고, 기본 타입이거나 성능에 민감할 때는 배열을 사용했다. 그런데? 자바 8에서 스트림이 생기면서, 선택지가 복잡해졌다. item 45에서 봤듯이 stream은 반복을 지원하지 않는다. forEach같은 애들은 List, Set과 같은 Iterable구현체에 대해서만 사용이 가능하다.따라서 스트림과 반복을 적절히 섞어야 좋은 코드가 된다. 여기서 재미없는 사실 하나! 사.. 2022. 7. 2.
item 46. 스트림에서는 부작용 없는 함수를 사용하라 스트림은 그저 또 하나의 API가 아닌, 함수형 프로그래밍에 기초한 패러다임이다. 즉.. 스트림이 제공하는 표현력, 속도, 병렬성 등을 얻기 위해서는 '스트림 패러다임'을 받아들여야 한다. 스트림 패러다임의 핵심이란? : 계산을 일련의 변환으로 재구성 하는 부분 각 변환 단계는 가능한 한 이전 단계의 결과를 받아 처리하는 순수 함수 (*다른 가변 상태를 참조하거나 스스로 상태를 변경하지 않고, 오직 입력만이 결과에 영향을 주는 함수)여야 한다. 이를 위해선 스트림 연산에 건네는 함수는 모두 부작용이 없어야 한다. forEach 연산은 스트림 계산 결과를 보고할 때만 사용하고, 계산하는 데는 쓰지 말자. 스트림 패러다임을 이해하지 못한 채 API만 사용한 예시를 보자. "스트림 코드를 가장한 반복적 코드".. 2022. 7. 2.
item 45. 스트림은 주의해서 사용하라. 스트림이 뭘까요? : 데이터 처리 작업(순차 또는 병렬)을 지원하고자 Java8부터 추가된 API 스트림이 제공하는 추상 개념의 핵심 두가지 1. 데이터 원소의 유한 혹은 무한 시퀀스 2. 원소들로 수행하는 연산 단계를 표현하는 스트림 파이프 라인 스트림의 원소는 컬렉션, 배열, 파일, 정규표현식 패턴 매처, 난수 생성기 등 어디로부터든 올 수 있다. 스트림 안의 데이터 원소들은 객체 참조나 int, long, double의 기본 타입 값이다. 스트림 파이프 라인의 생애 주기(?) 소스 스트림 -> 1개 이상의 중간 연산 -> 종단 연산 스트림 중간 연산들은 모두 한 스트림을 다른 스트림으로 변화시키는데, 변환된 스트림의 원소 타입 값은 기존과 다를 수 있다. 종단 연산은 마지막 중간 연산이 내놓은 스.. 2022. 6. 18.
item 44. 표준 함수형 인터페이스를 사용하라 핵심만 쏙쏙.. 불필요한 함수형 인터페이스를 직접 구현해 사용하지 말고, 대신 표준형 함수형 인터페이스를 사용하라. 왜? 자바 표준 라이브러리에 이미 같은 모양의 인터페이스가 있을 것이다. 필요한 용도에 맞는 인터페이스가 있는지 먼저 확인해라. 심지어, 표준 함수형 인터페이스들은 유용한 디폴트 메서드도 많이 제공한다. 이는 다른 코드와의 상호 운용성도 높인다. java.util.function 패키지의 인터페이스 43가지! 다 기억하긴 어렵고, 기본 인터페이스 6개는 꼭 기억해두자. (모두 참조용 타입이다.) 인터페이스 함수 시그니처 의미 예시 UnaryOperator T apply(T t) 반환 값과 인수의 타입이 같은 함수, 인수는 1개 String::toLowerCase BinaryOperator .. 2022. 6. 18.
item 43. 람다보다는 메서드 참조를 사용하라 자바에서 함수를 간결하게 하는 방법! : 메서드 참조 > 람다 > 익명 클래스 Map의 merge 메소드를 통하여 예시를 살펴보자. Map map = new HashMap(); map.put(1, 2); map.put(3, 4); map.put(5, 6); int key = 1; map.merge(key, 2, (count, incr) -> count + incr); [코드 설명] Map 타입 객체에 key를 매핑한다. Map 안에 key가 존재한다면, value와 기존 key에 매핑되는 value를 더한다. 존재하지 않을 경우에는 key, value를 추가한다. : 깔끔해 보이지만, 매개변수 count와 incr은 크게 하는 일 없이 공간을 많이 차지하기 때문에, 거추장스럽다. : 또한 여기서 사용된 .. 2022. 6. 17.
728x90