본문 바로가기

Dev Books/Effective Java27

[item 47] 반환 타입으로는 스트림보다 컬렉션이 낫다 Java 8 이전(즉, Java 7까지)Java 7까지는 Stream API가 존재하지 않았기 때문에, 메서드에서 여러 원소(시퀀스)를 반환해야 할 때 사용할 수 있는 타입은 다음과 같았다. Collection(인터페이스): 여러 값을 담는 일반적인 컬렉션 타입. 예: ArrayList, HashSet 등Set, List: Collection의 하위 타입Iterable: for-each 문에서 순회할 수 있는 최소 요건을 가진 타입배열: String[], int[] 같은 고전적인 방식특별한 이유가 없다면, 보통은 Collection이나 그 하위 타입 (List, Set)을 반환 타입으로 선택했다.Collection이 다양한 유용한 메서드를 제공하기 때문이다.예: size(), contains(), isE.. 2025. 7. 15.
[item 46] 스트림에서는 부작용 없는 함수를 사용하라 1. stream스트림은 그저 또 하나의 API가 아닌, 함수형 프로그래밍에 기초한 패러다임이다. 스트림이 제공하는 표현력, 속도, (상황에 따라서는) 병렬성을 얻으려면 패러다임까지 함께 받아들어야 한다.stream paradigm스트림 패러다임의 핵심은 계산을 일련의 변환(transformation)으로 재구성하는 부분이다. 이때 각 변환 단계는 가능한 한 이전 단계의 결과를 받아 처리하는 순수함수여야 한다. 순수함수순수함수란 오직 입력만이 결과에 영향을 주는 함수를 말한다.다른 가변 상태를 참조하지 않고, 함수 스스로도 다른 상태를 변경하지 않는다.즉, 같은 입력에 대해서는 항상 같은 출력을 보장하며, 부작용(side effect)이 없다. 예를 들어 아래 함수는 순수 함수이다. 순수 함수 예시 (P.. 2025. 7. 11.
[item 45] 스트림은 주의해서 사용하라 Stream APIStream API는 다량의 데이터 처리 작업을 돕고자 자바 8에 추가되었다. 이 API가 제공하는 추상 개념 중 핵심은 두가지다.데이터 원소의 유한 혹은 무한 시퀀스(sequence)를 뜻한다.stream pipeline은 이 원소들은 어디로부터든 올 수 있다.대표적으로는 컬렉션, 배열, 파일, 정규표현식 패턴 matcher, 난수 생성기, 다른 스트림이 있다. 스트림 안의 데이터 원소들은 객체 참조나 기본 타입 값이다. 기본 타입 값으로는 int, long, double 이렇게 3가지를 지원한다.stream pipeline스트림 파이프라인은 다음 3단계로 구성된다. 스트림 파이프라인은 소스 스트림에서 시작해 종단 연산(terminal operation)으로 끝나며, 그 .. 2025. 7. 9.
[item 44] 표준 함수형 인터페이스를 사용하라 1. 불필요한 함수형 인터페이스를 만들지 말고 표준 함수형 인터페이스를 사용하라.Java 8부터는 java.util.function 패키지에 다양한 표준 함수형 인터페이스가 제공된다. 굳이 새로 함수형 인터페이스를 만들지 말고, 이미 제공되는 인터페이스 (예: Predicate, Function, Consumer)를 쓰는 것이 유지보수성과 가독성 면에서 좋다. 새로운 인터페이스를 만들더라도 정말 기존 것에 맞지 않거나 의미가 분명히 다를 때만 만들어야 한다.예시 1: LinkedHashMap.removeEldestEntryLinkedHashMap은 removeEldestEntry(Map.Entry eldest) 메서드를 재정의하면 캐시로 사용할 수 있다. // 최대 100개 항목까지만 유지되는 캐.. 2025. 7. 1.