<aside> 💡 적합한 인터페이스만 있다면 매개변수 뿐 아니라 반환값, 변수, 필드 전부 인터페이스 타입으로 선언할 것
</aside>
객체의 실제 클래스를 사용해야 할 상황은 생성자로 생성할 때뿐이다.
인터페이스를 타입으로 사용하는 습관 길러두면 프로그램이 더 유연해질 것!
Set<Son> sonSet = new LinkedHashSet<>(); //좋은 예, 인터페이스를 타입으로 사용함
Set<Son> sonSet = new HashSet<>();
LinkedHashSet<Son> sonSet = new LinkedHashSet<>(); //나쁜 예, 클래스를 타입으로 사용함
주의점
원래 클래스가 인터페이스 일반 규약 이외의 특별한 기능을 제공하며, 주변 코드가 이 기능에 기대 동작한다면 새로운 클래스도 반드시 같은 기능 제공해야 한다.
값 클래스는 final인 경우가 많고 상응하는 인터페이스 존재하는 경우는 드물다.
이런 값 클래스는 매개변수, 변수, 필드, 반환 타입으로 사용해도 된다.
이 경우에도 특정 구현 클래스보다 기반 클래스(보통 추상 클래스) 사용해 참조하는 게 좋다.