Item 21 - 인터페이스는 구현하는 쪽을 생각해 설계하라
디폴트 메서드의 도입 자바 8 이전에는 기존 구현체를 깨뜨리지 않고는 인터페이스에 메서드를 추가할 방법이 없었다. 자바 8부터는 디폴트 메서드가 소개되면서 기존 인터페이스에 메서드를 추가할 수 있게 되었다. 그러나 이렇게 추가된 디폴트 메서드가 모든 기존 구현체들과 매끄럽게 연동되리라는 보장은 없다. 디폴트 메서드 추가 시 주의...
디폴트 메서드의 도입 자바 8 이전에는 기존 구현체를 깨뜨리지 않고는 인터페이스에 메서드를 추가할 방법이 없었다. 자바 8부터는 디폴트 메서드가 소개되면서 기존 인터페이스에 메서드를 추가할 수 있게 되었다. 그러나 이렇게 추가된 디폴트 메서드가 모든 기존 구현체들과 매끄럽게 연동되리라는 보장은 없다. 디폴트 메서드 추가 시 주의...
인터페이스의 장점 자바 8부터 인터페이스도 디폴트 메서드를 제공할 수 있다. 기존 클래스에 손쉽게 새로운 인터페이스를 구현해 넣을 수 있다. BUT, 추상 클래스는 그렇지 않다. 새로 추가된 추상 클래스의 모든 자손이 상속 구조를 가지면서 혼란을 준다. 인터페이스는 믹스인(mixin) 정의에 안...
상속을 고려한 설계와 문서화 📃 (1) 상속용 클래스는 내부 구현을 문서로 남겨야 한다. 상속용 클래스는 재정의 할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야 한다. 아래와 같이 @implSpec 태그를 이용해서 불필요하게 내부 구현 방식을 설명해야 한다. (2) 클래스의 내부 동작 과정 중간에 끼어 들어갈 수 있...
데코레이터 패턴(Decorator Pattern) 이란? 객체에 동적으로 기능을 추가하여 확장할 수 있게 해주는 디자인 패턴 상속을 통해 클래스를 확장하는 대신, 객체를 감싸는 방식으로 기능을 추가하거나 변경한다. 기존 코드를 수정하지 않고도 새로운 기능을 추가하거나 수정할 수 있게 된다. 데코레이터 패턴...
상속은 코드를 재사용하는 강력한 수단이지만 항상 최선은 아니다. 상속의 문제점 아래의 클래스는 정상적으로 보이지만 문제가 있다. public class InstrumentedHashSet<E> extends HashSet<E> { private int addCount = 0; public Instrume...
불변 클래스 인스턴스의 내부 값을 수정할 수 없는 클래스 ex. String, BigInteger, BigDecimal, 기본 박싱 클래스들 불변 클래스는 가변 클래스보다 설계/구현/사용이 쉽고, 오류가 생길 여지도 적다. 불변 클래스를 만들기 위한 규칙 객체의 상태를 변경하는 메서드를 제공하지 않는...
퇴보한 클래스 예시 class Point { public double x; public double y; } 해당 클래스는 데이터 필드에 직접 접근할 수 있기에 캡슐화 이점을 제공하지 못한다. 필드를 변경하려면 API를 변경해야한다. 불변식을 보장할 수 없고, 스레드 안전하지 않다 외부에서...
구현과 API를 분리하는 “정보 은닉”의 장점 시스템 개발 속도를 높인다. (여러 컴포넌트를 병렬로 개발할 수 있기 때문에) 시스템 관리 비용을 낮춘다. (컴퍼넌트를 더 빨리 파악할 수 있기 때문에) 성능 최적화에 도움을 준다. (최적화할 컴포넌트를 정한 후, 다른 컴포넌트에 영향끼치지 않고 해당 컴포넌트만 개선 가능하기 때문에) 소프...
compareTo 규약 Object.equals()와 다르게 단순 동치성 비교 뿐만 아니라 순서 비교도 가능하며 제네릭하다. 자기 자신이 (this)이 compareTo에 전달된 객체보다 작으면 음수, 같으면 0, 크다면 양수를 리턴한다. 반사성(A>B = B<A), 추이성(A<B, B<C 이면 A<C), 일관성...
clone 메서드가 선언된 곳이 Cloneable이 아닌 Object이며, 접근 제한자가 protected이기 때문에 Cloneable을 구현하는 것만으로는 외부 객체에서 clone 메서드를 호출할 수 없다. 이런 문제점에도 불구하고, Cloneable 방식은 널리 쓰인다. 이에 대해 알아보자. Cloneable 인터페이스 Object...