[Java] Effective Java 정리 - (Item 42 ~ Item 48)

황시준·2023년 8월 12일

1. 익명 클래스보다는 람다를 사용하라.

  • Java8부터 작은 함수 객체를 구현하는데 적합한 람다가 도입되었다.
  • 익명 클래스는 타입의 인스턴스를 만들 때만 사용하라.
  • 람다는 작은 함수 객체를 아주 쉽게 표현할 수 있어 함수형 프로그래밍의 지평을 열었다.

2. 람다보다는 메서드 참조를 사용하라.

  • 메서드 참조는 람다의 간단명로한 대안이 될 수 있다.
  • 메서드 참조 쪽이 짧고 명확하다면 메서드 참조를 쓰고, 그렇지 않을 때만 람다를 사용하라.

3. 표준 함수형 인터페이스를 사용하라.

  • 자바도 람다를 지원한다. API를 설계할 때 람다도 염두에 두어야 한다는 뜻이다.
  • 입력값과 반환값에 함수형 인터페이스 타입을 활용하라.
  • 보통은 java.util.function 패키지의 표준 함수형 인터페이스를 사용하는 것이 가장 좋은 선택이다.
  • 단, 흔치는 않지만 직접 새로운 함수형 인터페이스를 만들어 쓰는 편이 나을 수 있음을 잊지 말자.

4. 스트림은 주의해서 사용하라.

  • 스트림을 사용해야 멋지게 처리할 수 있는 일이 있고, 반복 방식이 더 알맞은 일도 있다.
  • 그리고 수많은 작업이 이 둘을 조합했을 때 가장 멋지게 해결된다.
  • 어느 쪽을 선택하는 확고부동한 규칙은 없지만 참고할 만한 지침 정도는 있다.
  • 어느 쪽이 나은지가 확연히 드러나는 경우가 많겠지만, 아니더라도 방법은 있다.
  • 스트림과 반복 중 어느 쪽이 나은지 확신하기 어렵다면 둘 다 해보고 더 나은 쪽을 택하라.

5. 스트림에서는 부작용 없는 함수를 사용하라.

  • 스트림 파이프라인 프로그래밍의 핵심은 부작용 없는 함수 객체에 있다.
  • 스트림뿐 아니라 스트림 관련 객체에 건네지는 모든 하수 객체가 부작용이 없어야 한다.
  • 종단 연산 중 forEach는 스트림이 수행한 계산 결과를 보고할 때문 이용해야 한다.
  • 계산 자체에는 이용하지 말자.
  • 스트림을 올바로 사용하려면 수집기를 잘 알아야한다. (Collector)
  • 가장 중요한 수집기 팩토리는 toList, toSet, toMap, groupingBy, joining이다.

6. 반환 타입으로는 스트림보다 컬렉션이 낫다.

  • 원소 시퀸스를 반환하는 메서드를 작성할 때는, 이를 스트림으로 처리하기를 원하는 사용자와 반복으로 처리하길 원하는 사용자가 모두 있을 수 없음을 떠올리고, 양쪽을 다 만족시키려 노력하자.
  • 컬렉션을 반환할 수 있다면 그렇게 하라.
  • 반환 전부터 이미 원소들을 컬렉션에 담아 관리하고 있거나 컬렉션을 하나 더 만들어도 될 정도로 원소 개수가 적다면 ArrayLst같은 표준 컬렉션에 담아 반환하라.
  • 그렇지 않으면 앞서의 멱집합 예처럼 전용 컬렉션을 구현할지 고민하라.
  • 컬렉션을 반환하는게 불가능하다면 스트림과 Iterable중 더 자연스러운 것을 반환하라.
  • 만약 나중에 Stream 인터페이스가 Iterable을 지원하도록 자바가 수정되었다면, 그때는 안심하고 스트림을 반환하면 될 것이다.

7. 스트림 병렬화는 주의해서 적용하라.

  • 계산도 올바로 수행하고 성능도 빨라질 거라는 확신 없이는 스트림 파이프라인 병렬화는 시도조차 하지 말라.
  • 스트림을 잘못 병렬화하면 프로그램을 오동작하게 하거나 성능을 급격히 떨어뜨린다.
  • 병렬화하는 편이 낫다고 믿더라도, 수정 후의 코드가 여전히 정확한지 확인하고 운영 환경과 유사한 조건에서 수행해보며 성능지표를 유심히 관찰하라.
  • 그래서 계산도 정확하고 성능이 좋아졌음이 확실해졌을 때, 오직 그럴 때만 병렬화 버전 코드를 운영 코드에 반영하라.
profile
하고싶은게 많은 newbie

0개의 댓글