[Effective Java] 객체는 인터페이스를 사용해 참조하라

들어가며

객체를 선언할 때는 대부분 인터페이스를 사용해야 한다. 인터페이스를 타입으로 사용하면 프로그램이 훨씬 유연해진다. 다음 코드를 보자.

1
2
Set<Foo> fooSet = new LinkedHashSet<>();
Set<Foo> fooSet = new HashSet<>();

단 주의해야할 점은 있다. 원래의 클래스가 인터페이스의 일반 규약 이외의 특별한 기능을 제공하며 주변 코드가 이 기능에 기대어 동작한다면 새로운 클래스도 반드시 같은 기능을 제공해야 한다. 예를 들어 LinkedHashSet의 순회 정책을 따르는 코드는 HashSet으로 바꾼다면 문제가 생길 수 있다.

적합한 인터페이스가 없다면 당연히 클래스로 참조해야한다. String과 BigInteger같은 값 클래스가 그 예이다. 이런 값 클래스는 대부분 final로 선언되어 있다. 적합안 인터페이스가 없는 두번째 예는 클래스 기반으로 작성된 프레임워크가 제공하는 객체들이다. 이럴때는 특정 구현 클래스보단 상위 추상 클래스를 사용하자. 적합한 인터페이스가 없는 마지막 부류는 특별한 메소드를 제공하는 클래스들이다. PriorityQueue가 이에 해당한다. PQ는 Q에 없는 comparator 메소드를 제공한다.

클래스를 사용하는 경우도 있지만 인터페이스를 사용할 수 있을 경우 인터페이스를 사용해야 한다. 클래스를 사용하게 된다면 클래스의 계층구조 중 필요한 기능을 만족하는 가장 덜 구체적인 상위클래스를 타입으로 사용하자

Author: Song Hayoung
Link: https://songhayoung.github.io/2020/08/21/Languages/Effective%20JAVA/item64/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.