본문 바로가기

이펙티브 자바

(48)
[이펙티브 자바] 아이템 48. 스트림 병렬화는 주의해서 사용하라 병렬화를 사용하면 여러 프로세스 또는 스레드를 동시에 실행하여 작업을 처리한다. 이렇게 함으로써 여러 프로세서 또는 코어를 활용하여 작업을 분산시키고 병렬적으로 실행함으로써 전체 작업을 효율적으로 처리할 수 있다. 하지만 스트림 병렬화는 절대 시도조차 하지 말자. 데이터 소스가 Stream.iterate 거나 중간 연산으로 limit을 쓰면 파이프라인 병렬화로는 성능 개선을 기대할 수 없다. Stream.iterate 메서드는 무한한 요소 시퀀스를 생성하므로 병렬 처리가 어렵다. 또한 limit 메서드는 요소의 수를 제한하기 때문에 요소를 나누어 병렬 처리하는 것이 어려워진다. 이러한 상황에서는 파이프라인 병렬화로 성능 향상을 기대하기 어렵다.  스트림을 잘못 병렬화하면 (응답 불가를 포함해) ..
[이펙티브 자바] 아이템 47. 반환 타입으로는 스트림보다 컬렉션이 낫다 컬렉션(Collection):일련의 객체를 저장하고 관리하는 자료구조.주요 컬렉션 인터페이스에는 List, Set, Queue 등이 있으며, 각각 ArrayList, LinkedList, HashSet, TreeSet, PriorityQueue 등의 구현체가 있다.컬렉션은 데이터를 저장하고 필요할 때 검색, 추가, 삭제 등의 작업을 수행할 수 있다.컬렉션은 데이터의 저장 순서가 보장될 수 있고, 중복된 요소를 허용할 수도 있다.스트림(Stream):데이터를 처리하는 파이프라인 형태의 API.자료 처리 연산을 지원하며, 이를 이용하여 데이터를 필터링, 매핑, 정렬, 그룹화하는 등의 작업을 수행할 수 있다.스트림은 컬렉션, 배열, 파일 등의 데이터 소스에서 데이터를 가져와서 연속된 연산..
[이펙티브 자바] 아이템 46. 스트림에서는 부작용 없는 함수를 사용하라 수집기(collector) : 스트림의 최종 연산(terminal operation) 중 하나로, 스트림의 요소를 수집하여 다양한 형태로 결과를 생성하거나 반환하는 역할을 한다.  toList(): 스트림의 요소를 리스트로 수집한다.toSet(): 스트림의 요소를 집합(Set)으로 수집한다.toMap(): 스트림의 요소를 맵(Map)으로 수집한다.joining(): 문자열 요소를 하나의 문자열로 연결한다.groupingBy(): 지정된 기준에 따라 스트림의 요소를 그룹화한다.스트림과 수집기를 사용한 예시import java.util.Arrays;import java.util.List;import java.util.stream.Collectors;public class Main ..
[이펙티브 자바] 아이템 45. 스트림은 주의해서 사용하라 스트림 : 데이터 요소들의 연속된 시퀀스를 처리하는 데 사용된다. 스트림은 컬렉션, 배열 등의 데이터 소스로부터 데이터를 읽어들이고, 그 데이터를 변환하거나 조작할 수 있는 기능을 제공한다. 스트림을 사용한다고 무조건 더 코드가 좋아지지는 않는다. 스트림을 과도하게 사용하면 프로그램이 읽거나 유지보수하기 더 어려워진다. 특히 스트림에 익숙하지 않은 프로그래머라면 더욱 그렇다. 이를 절충하기 위해 스트림을 적당히 사용하면 명확하게 이해하기 좋아진다. 핵심 정리 : 스트림을 사용해야 멋지게 처리할 수 있는 일이 있고, 반복 방식이 더 알맞은 일도 있다. 그리고 수많은 작업이 이 둘을 조합했을 때 가장 멋지게 해결된다. 어느 쪽을 선택하는 확고부동한 규칙은 없지만 참고할 만한 지침 정도는 있다. 어느 쪽이 나..
[이펙티브 자바] 아이템 아이템44. 표준 함수형 인터페이스를 사용하라 표준 함수형 인터페이스(Standard Functional Interfaces) : 자바에서 함수형 프로그래밍을 지원하기 위해 미리 정의된 인터페이스들을 말한다. 이러한 인터페이스들은 자주 사용되는 함수형 작업을 수행하기 위해 특별히 설계되었으며, 자바에서 람다 표현식과 함께 주로 사용된다. 자바 8에서는 java.util.function 패키지에 표준 함수형 인터페이스들이 정의되어 있다. 이러한 인터페이스들은 주로 함수형 인터페이스를 사용하는 메서드의 매개변수나 반환값으로 사용된다. 주요 표준 함수형 인터페이스들은 다음과 같다: Consumer: 단일 입력 매개변수를 받고, 반환값이 없는 동작을 수행한다. (void accept(T t)) import java.util.function.Consumer;..
[이펙티브 자바] 아이템 43. 람다보다는 메서드 참조를 사용하라 메서드 참조(Method Reference) : 자바에서 메서드를 참조하는 방법을 말한다. 람다 표현식이나 익명 클래스에서 메서드를 호출하는 것 대신에, 이미 존재하는 메서드의 이름을 사용하여 해당 메서드를 참조하는 방식이다. 정적 메서드 참조(Static Method Reference): 클래스이름::정적메서드이름 형태로 사용된다. 인스턴스 메서드 참조(Instance Method Reference): 참조변수::인스턴스메서드이름 형태로 사용된다. 클래스 생성자 참조(Constructor Method Reference): 클래스이름::new 형태로 사용되며, 인스턴스를 생성하는 데 사용된다. // 람다 표현식 Function toInteger = s -> Integer.parseInt(s); // 메서..
[이펙티브 자바] 아이템 42. 익명 클래스보다는 람다를 사용하라 익명 클래스(Anonymous Class) : 이름이 없는 클래스로, 주로 인터페이스의 구현체를 생성할 때 사용된다. 익명 클래스는 일회성으로 사용되며, 클래스 정의와 동시에 인스턴스를 생성하여 사용할 수 있다. Collections.sort(words, new Comparator() { public int compare(String s1, String s2) { return Integer.compare(s1.length(), s2.length()); } }); 람다 표현식 : 간결하고 명확한 방식으로 익명 함수를 나타내는 것. 주로 함수형 인터페이스(하나의 추상 메서드를 가지는 인터페이스)의 구현체를 생성하는 데 사용된다. Collections.sort(words, (s1, s2) -> Integer...
[이펙티브 자바] 아이템 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 마커 인터페이스 : 아무 메서드도 담고 있지 않고, 자기 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해주는 인터페이스. // 마크 인터페이스 public interface MarkerInterface { // 메서드나 상수를 정의하지 않음 } // 위의 마크 인터페이스를 구현하는 클래스 public class MyClass implements MarkerInterface { // 클래스의 구현 } 마커 애너테이션 : 단순히 존재 여부로 정보를 제공하는 애너테이션. 마커 인터페이스가 마커 애너테이션보다 나은점 : 1. 마커 인터페이스는 타입이기 때문에 애너테이션을 사용했다면 런타임에야 발견될 오류를 컴파일타임에 잡을 수 있다. 2. 적용 대상을 더 정밀하게 지정할 수 있다. @Target : 해당 애..