item 64) 객체는 인터페이스를 사용해 참조하라
인터페이스 타입으로 선언
적합한 인터페이스가 있다면, 매개변수뿐 아니라 반환 값, 변수, 필드를 전부 인터페이스 타입으로 선언하도록 한다.
구현 클래스를 교체하고자 할 때 새 클래스의 생성자를 호출하기만 하면 된다.
실제 클래스를 사용해야 하는 상황은 생성할 때 뿐이다.
원래 클래스가 인터페이스 일반 규약 이외의 기능을 제공하고 주변 코드가 이 기능에 의해 동작한다면, 새로운 클래스도 반드시 같은 기능을 제공해야 한다.
예를 들어 LinkedHashSet 선언 주변 코드가 순서가 보장됨을 가정하고 동작하는 상황에서, 순서가 보장되지 않는 HashSet으로 변경하면 문제가 생길 수 있다.
적합한 인터페이스가 없는 경우
아래 경우들에 대해서는 인터페이스 대신 클래스 타입을 사용한다.
값 클래스는 여러 가지로 구현되지 않기 때문에 final인 경우가 많고 인터페이스가 존재하지 않는 경우가 많다. 따라서 매개변수, 변수, 필드, 반환 타입으로 사용해도 무방하다.
클래스 기반으로 작성된 프레임워크가 제공하는 객체들의 경우, 기반 클래스(보통은 추상 클래스)를 사용해 참조하는 것이 좋다. ex) OutputStream ...
인터페이스에 없는 특별한 메서드를 제공하는 클래스 ex) PriorityQueue는 Queue 인터페이스에 없는 comparator 메서드 제공
Last updated