brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Aug 20. 2018

Effective Java - 프로그래밍 일반

#52 객체 참조는 그 객체의 인터페이스 타입으로 하자

Effective Java - 프로그래밍 일반


#52 객체 참조는 그 객체의 인터페이스 타입으로 하자


#01 객체를 참조할 때 클래스보다는 인터페이스를 이용해야 합니다.


// good
List<Subscriber> subscribers = new Vector<>();

// bad
Vector<Subscriber> subscribers = new Vector<>():

Vector는 List 인터페이스를 구현한 클래스(구현체)입니다.

둘 다 동일하게 동작하지만, 인터페이스를 객체 타입으로 이용하면 코드가 좀 더 유연해집니다.


// Vector 구현체를 ArrayList로 변경
List<Subscriber> subscribers = new ArrayList<>();

List 인터페이스를 구현하는 클래스(구현체)를 바꾸고 싶을 때, new 키워드 다음에 나오는 생성자의 이름만 변경하면 되기 때문입니다.


이를 통해 클라이언트는 내부 변화를 굳이 알지 않고도, List 인터페이스에 정의된 모든 메서드와 코드들을 그대로 이용할 수 있습니다.


단, Vector의 동기화 정책에 의존하는 코드가 있다면, ArrayList에서 이를 그대로 구현하는 별도의 코드를 추가해야 합니다.

즉, 어떤 클래스(구현체)의 특별한 속성의 의존한다면, 그 속성과 관련된 요구 사항들을 문서화해야 합니다.




#02 적합한 인터페이스가 없다면, 클래스를 이용하는 수밖에 없습니다.


말 그대로 어쩔 수 없을 땐, 인터페이스가 아닌 클래스를 이용해야 합니다.

String이나 BigInteger 같은 값 클래스(value class)는 서브 클래스로 확장이 불가능합니다.

그리고 Random 클래스처럼 자신과 연관된 인터페이스가 없다면 클래스를 이용해야 합니다.




주어진 객체가 적합한 인터페이스를 갖고 있는지 여부에 따라 인터페이스 타입을 이용할 수 있습니다.

만약 인터페이스를 이용할 수 없다면, 슈퍼 클래스(주로 추상 클래스)를 객체 참조 타입으로 이용할 수 있습니다.

매거진의 이전글 Effective Java - 프로그래밍 일반
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari