아이템 21. 인터페이스는 구현하는 쪽을 생각해 설계하라 자바 8 전에는 인터페이스에 메서드를 추가시키면, 기존 구현체를 깨뜨릴 수밖에 없음 이후 자바 8에 디폴트 메서드가 추가되면서 쉽게 메서드를 추가시킬 수 있게 되었지만, 여전히 위험성은 존재 디폴트 메서드를 추가한다는 것은 구현체에 대한 아무런 정보 없이 무작정 메서드가 삽입되는 것 대부분 잘 작동하지만, 모든 상황에서 잘 작동되는 디폴트 메서드를 작성하는 것은 어려움 디폴트 메서드에 의한 문제점 예시 자바 8 Collection 인터페이스의 removeIf 메서드 default boolean removeIf(Predicate
잘 설계된 컴포넌트는 외부로부터 내부 구현이 잘 숨겨져 있어서 구현과 API가 깔끔히 분리되어 있다. 이것을 정보은닉, 또는 캡슐화라고 한다. 정보 은닉의 장점 시스템 개발 속도 향상 시스템 관리 비용 절감 성능 최적화에 도움을 줌 소프트웨어 재사용성 향상 큰 시스템 제작의 난이도 감소 접근 제한 수준 private : 멤버를 선언한 톱레벨 클래스만 접근 가능 package-private(default) : 멤버가 소속된 패키지 안의 모든 클래스에서 접근 가능 protected : package-private의 접근 범위 포함, 이 멤버를 선언한 클래스의 하위 클래스에서도 접근 가능 public : 모든 곳에서 접근 가능 접근 제한자 활용 원칙 모든 클래스와 멤버의 접근성을 가능한 한 좁힌다. publi..
정적 팩터리나 생성자를 통한 객체 생성은 선택적 매개변수가 많을 때 적절히 대응하기가 어려운 단점이 있다. 이를 해결하기 위해 책에서는 세가지 패턴을 소개한다. 점층적 생성자 패턴 필수 매개변수만 받는 생성자 부터 시작해 선택 매개변수를 전부 다 받는 생성자까지 매개변수를 늘려나가는 방식 인스턴스를 만들려면 원하는 매개변수를 모두 포함한 생성자 중 가장 짧은 것을 골라 호출 이 경우, 보통 사용자가 설정하길 원하지 않는 매개변수 까지 포함할 수도 있는데, 어쩔 수 없이 그런 매개변수도 값을 지정해줘야 함. 즉, 점층적 생성자 패턴은 매개변수의 개수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵게 된다. public class NutritionFacts { private final int serving..
Optional은 무엇인가요? Optional는 'T타입의 객체'를 감싸는 래퍼 클래스이다. Optional의 용도 (옵셔널 반환은 신중히 하라, 이펙티브 자바 아이템 55) 자바 8전에는 메서드가 특정 조건에서 값을 반환할 수 없을 때, 예외를 던지거나 null을 반환했다. 두 방법 모두 허점이 있다. 예외는 진짜 예외 상황에만 사용해야 한다. (이펙티브 자바 아이템 69) 또, 예외 생성 시 스택 추적에 비용이 든다. null을 반환할 수 있는 메서드 호출 시, null 처리 코드를 추가해야 한다. 만약, 무시하고 처리하지 않으면 나중에 원인과는 상관없는 곳에서 NPE가 발생할 수 있다. Optional는 null이 아닌 T타입 참조를 하나 담거나, 아무것도 담지 않을 수 있다. 이를 이용해 보통은 ..