leelee.log

item64 객체는 인터페이스를 사용해 참조하라 본문

Book/이팩티브 자바

item64 객체는 인터페이스를 사용해 참조하라

leeleelee3264 2020. 5. 14. 22:56

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...) 사용할 때
  • 인터페이스에는 없는 특별한 메서드를 제공하는 클래스들을 사용할 때

image

java.io package 계층도

인터페이스에 없는 특별한 메서드를 제공하는 클래스들을 사용할 때?

적합한 인터페이스가 없다면 클래스의 계층구조 중 필요한 기능을 만족하는 가장 덜 구체적인 상위의 클래스를 타입으로 사용해야 한다.