Item 64. Interface Reference
객체는 인터페이스를 사용해 참조하라
타입으로는 클래스보다는 인터페이스가 더 낫기 때문에, 적합한 인터페이스가 있다면 매개변수, 반환값, 변수, 필드를 모두 인터페이스 타입으로 선언하는 것이 좋다. 실제 클래스는 생성할 때만 사용하고 그 외에는 인터페이스로만 사용하는 것이 좋다.
구현체 변경 시 주의점
인터페이스로 선언하면 구현 클래스 생성자만 변경하는 것으로도 다른 구현체로 쉽게 교체할 수 있어 훨씬 더 유연한 코드를 작성할 수 있다. 하지만 교체하려는 클래스 역시 같은 기능을 제공해야하기 때문에 주의해야한다.
LinkedHashSet
->HashSet
교체: 바꾸면서 순서가 보장되지 않는다는 문제가 생긴다.HashMap
->LinkedHashMap
교체: 성능은 비슷하게 유지하면서 순서가 보장되는 클래스로 교체할 수 있다.
클래스를 사용해야하는 경우
적합한 인터페이스가 없는 경우
여러 가지로 구현될 수 있도록 설계되지 않은 클래스들로, 이 경우엔 클래스를 사용해도 된다.
String
,BigInteger
,BigDecimal
등 존재
클래스 기반으로 작성된 프레임워크가 제공하는 객체들
이 경우에도 특정 구현 클래스보다는 기반 클래스를 사용하는 것이 좋다.
InputStream
,OutputStream
,ExecutorService
등 존재
인터페이스에는 없는 특별한 메서드를 제공하는 클래스
PriorityQueue
클래스는Queue
인터페이스에는 없는comparator
메서드를 제공한다.이 경우에도 특별한 메서드를 사용하기 위해 클래스를 사용하는 것이 좋다.
이런 경우는 특수한 상황에서만 사용하고, 가능하면 인터페이스 기반으로 사용하는 것이 좋다.
Last updated
Was this helpful?