들어가기 전 이 글은 인프런 백기선님의 이펙티브 자바 강의를 복습하며 작성한 글입니다. 이 글의 요약 인터페이스는 추상 클래스보다 더 많은 장점이 있다. 따라서 인터페이스를 기본으로 사용하되, 추상 클래스는 나중에 사용하자. 인터페이스에서는 default 메서드를 이용해 구현체 변경 없이 확장 가능하다. 인터페이스의 default 메서드는 구현체의 세부 구현을 깨뜨릴 소지가 있따. 인터페이스를 Wrapper 클래스와 함께 사용하면 기능 확장을 안전하게 할 수 있다. 만약 상속이었다면, 부모 클래스의 세부 구현 사항과 결합해 깨지기 쉬운 코드가 된다. 계층구조가 아닌 클래스의 관계는 상속을 통해 Composition하여 새로운 기능을 만들기 쉽다 인터페이스 + 추상 클래스를 이용한 추상 골격 클래스는 Te..
들어가기 전 이 글은 인프런 백기선님의 이펙티브 자바 강의를 복습하며 작성한 글입니다. 핵심 정리 상속용 클래스는 내부 구현을 문서로 남겨야 한다. @implSpec을 사용할 수 있다. 상속용 클래스의 재정의 가능한 메서드들에 @implSpec 태그를 이용해 문서화 한다. 내부 동작 중간에 끼어들 수 있는 훅(hook)을 잘 선별하여 protected 메서드로 공개해야 한다. 상속용으로 설계한 클래스는 배포 전에 반드시 하위 클래스를 만들어 검증해야 한다. 상속용 클래스의 생성자는 재정의 가능한 메서드를 호출해서는 안된다. Cloneable(아이템 13)과 Serializable(아이템 86)을 구현할 때 조심해야 한다. 상속용으로 설계한 클래스가 아니라면 상속을 금지한다. final 클래스 또는 pri..
완벽 공략 p119, 데코레이터 패턴 p119, 컴포지션과 전달 조합은 넓은 의미로 위임(delegation)이라고 부른다. p119, 콜백 프레임워크와 셀프 문제 데코레이터 패턴 데코레이터 패턴은 다음 역할을 하는 패턴이다. 기존 코드를 변경하지 않고 부가 기능을 추가하는 패턴. 상속이 아닌 위임(컴포지션)을 사용해서 보다 유연하게(런타임에) 부가 기능을 추가하는 것도 가능하다. 일반적인 데코레이터 패턴의 모습은 위의 그림과 같다. 그렇지만 디자인 패턴은 '구조'가 중요한 것이 아니라 '의도'가 중요한 것이기 때문에 위의 형태를 가지는 것이 전형적인 데코레이터 패턴이구나, 라는 느낌만 가져가면 된다. 데코레이터 패턴의 장점 데코레이터 패턴의 가장 큰 장점은 새로운 클래스를 기존 클래스를 Composit..
핵심 정리 패키지 경계를 넘어 다른 패키지의 구체 클래스를 상속하는 일은 위험하다. 아래 두 가지 경우가 발생하면, 상속에서 구현한 메서드가 의도한 대로 동작하지 않을 수 있다. 상위 클래스에서 제공하는 메서드 구현이 바뀌는 경우 상위 클래스에서 새로운 메서드가 생기는 경우 상속보다는 컴포지션을 활용하라. 컴포지션 (Composition) 새로운 클래스를 만들고 private 필드로 기존 클래스의 인스턴스를 참조 (상속대신에 필드로 가진다) 새 클래스의 인스턴스 메서드들은 기존 클래스에 대응하는 메서드를 호출해 그 결과를 반환한다. (deligation 한다) 컴포지션을 이용하면, 기존 클래스의 구현이 바뀌거나 새로운 메서드가 생기더라도 아무런 영향을 받지 않는다. 들어가기 전 이번 글에서는 상속을 사용..
완벽 공략 p105, 새로 생성된 불변 인스턴스를 동기화 없이 다른 스레드로 건네도 문제없이 동작 (JLS 17.5) p106, readObject 메서드 (아이템 88)에서 방어적 복사를 수행하라. p112, 불변 클래스의 내부에 가변 객체를 참조하는 필드가 있다면... (아이템 88) p113, java.util.concurrent 패키지의 CountDownLatch 클래스 새로 생성된 불변 인스턴스를 동기화 없이 다른 스레드로 건네도 문제없이 동작 (JLS 17.5) 불변 인스턴스는 다른 쓰레드에서도 별도의 동기화 (Syncronization) 없이 다른 쓰레드에서 공유해서 써도 안전하다는 것이다. 내부가 모두 final 키워드로 선언되어 있기 때문에 A 쓰레드가 인스턴스를 생성하는 도중에 B 쓰레..