1. 객체는 클래스가 아닌 인터페이스로 참조하라
클래스가 아닌 인터페이스로 참조하는 예시
- 적합한 인터페이스가 있다면 객체를 클래스 타입이 아닌 인터페이스 타입으로 선언하는 것이 좋다.
- 이렇게 되면 구체적인 클래스 타입은 객체를 생성할 때 생성자에서만 사용하면 된다
- Example
코드의 유연성을 높이는 설계
- 기존에 사용하던 구현 클래스 타입을 다른 것으로 바꿔야 하는 상황이 종종 있다.
- 더 성능이 좋은 클래스 타입을 사용하고 싶은 경우
- 더 다양한 신기능을 사용할 수 있는 클래스 타입이 있는 경우
- HashMap 보다 EnumMap 이 속도도 더 빠르고 순회 순서도 키의 순서와 같아 순서 예측이 가능하다.
- EnumMap 은 키가 열거 타입인 경우에만 사용할 수 있다. 이 때 LinkedHashMap 을 사용하면
키 타입과 상관없이 사용할 수 있으면서 순회 순서를 예측할 수 있다.
- 인터페이스 타입으로 객체를 참조했다면 이런 변동사항에 훨씬 유연한 대처가 가능하다.
- 구현 클래스를 교체하고 싶다면 다른 클래스의 생성자를 호출해주기만 하면 되기 때문
- Example
- 주의사항
2. 참조할 만한 인터페이스가 없는 경우
값 클래스 (Value Class)
- 한번 값이 할당 된 이후에 변경되지 않음을 보장해야 하는 경우
- 예) String, BigInteger 등의 불변 객체
- 값 클래스가 여러가지로 구현될 수 있음을 염두에 두고 설계하는 일이 거의 없다.
- final 인 경우가 많고 상응하는 인터페이스가 별도로 존재하는 경우가 드물다.
- 값 클래스는 매개변수 / 변수 / 필드 / 반환 타입으로 사용해도 무방하다.