leelee.log
item64 객체는 인터페이스를 사용해 참조하라 본문
Effective Java 3e 아이템 64f를 요약한 내용 입니다.
적합한 인터페이스만 있다면 매개변수
뿐 아니라 반환값
, 변수
, 필드
를 전부 인터페이스 타입으로 선언하라.
객체의 실제 클래스를 사용해야 할 상황은 '오직' 생성자로 생성할 때뿐이다.
// 인터페이스 타입을 사용
Set<Son> sonSet = new LinkedHashSet<>();
// 클래스 타입을 사용
LinkedHashSet<Son> sonSet = new LinkedHashSet<>();
인터페이스를 타입으로 사용하는 습관을 길러두면 프로그램이 훨씬 유연해
진다.
// 인터페이스 타입 사용 해서 변경
// IBank myBank = ShinhanBank.newInstance("이승민");
// myBank.openAccount();
IBank myBank = WoriBank.newInstance(123);
myBank.openAccount();
// 클래스 타입 사용 해서 변경
// ShinhanBank myBank2 = ShinhanBank.newInstance("이승민2");
// myBank2.openAccount();
// myBank2.printUserName();
WoriBank myBank2 = WoriBank.newInstance(1234);
myBank2.openAccount();
myBank2.printUserId();
인터페이스 타입IBank를 사용했다면 IBank의 메소드들만 사용하기 때문에 구현체인 ShinhanBank 에서 WoriBank 로 클래스 교체가 손쉽게 일어난다. 그러나 ShinhanBank 클래스 타입을 사용하면 WoriBank로 다 바꿔주어야 하고 ShinhanBank에 구현되어있던 메소드들도 제거를 해줘야한다.
주변 코드들은 IBank의 존재만 알았지 구체적인 클래스인 ShinhanBank를 몰랐으니 아무런 영향을 받지 않는다.
클래스를 참조해야하는 경우
- String과 Big Integer과 같은
값
을 담는 클래스를 사용할 때 - 클래스 기반으로 작성된 프레임 워크가 제공하는 객체를 (java.io 패키지 객체들, Localdatetime etc...) 사용할 때
- 인터페이스에는 없는 특별한 메서드를 제공하는 클래스들을 사용할 때
java.io package 계층도
인터페이스에 없는 특별한 메서드를 제공하는 클래스들을 사용할 때?
적합한 인터페이스가 없다면 클래스의 계층구조 중 필요한 기능을 만족하는 가장 덜 구체적인 상위의 클래스를 타입으로 사용해야 한다.
'Book > 이팩티브 자바' 카테고리의 다른 글
item 86 Serializable을 구현할지는 신중히 결정하라 (0) | 2020.05.29 |
---|---|
item74 메서드가 던지는 모든 예외를 문서화하라 (0) | 2020.05.23 |
item 65 리플렉션보다는 인터페이스를 사용하라 (0) | 2020.05.18 |