객체는 인터페이스를 사용해 참조하라
포스트
취소

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

개요

이펙티브 자바에서 나온 내용인데 자주 활용하지만, 면접때 왜? 라고 하면 떠오르지 않을 수 있기 때문에 회고.

가장 많이 쓰는 예시

1
List<Object> lists = new ArryaList<>();

List는 거의 ArrayList로 생성해서 사용한다.

그렇다고 유연하게 쓰진 않지만…

그래서 왜?

책에서 강조한 내용은 아래와 같다

인터페이스를 타입으로 사용하는 습관을 길러두면 프로그램이 훨씬 유연해질 것이다.

유연해진다는 것이 무엇인지 좀 더 알아보자.

간단 예시

1
2
3
public void calculateData(Map<Boole, Object> data) {
    // TODO : calculation
}

이와 같이 Map을 주입 받으면 Map을 구현한 구현체를 모두 사용할 수 있는 메서드가 된다. 특별히 사용하고자 하는 구현체를 주입해도 해당 메서드는 문제 없이 동작 할 수 있다는 것이다.

아래와 같이 사용 가능하다.

1
2
3
4
5
Map<Boole, Object> datas = new EnumMap<Boole, Object>(Boole.class);
Map<Boole, Object> linkedDatas = new LinkedHashMap<>();

calculateData(datas);
calculateData(linkedDatas);

임의의 인터페이스를 만들고 그것을 구현한 구현체를 여러가지 종류 만들게 되면, 인터페이스로 선언하여 유연하게 다양한 동작을 처리할 수 있다.

그래도…

항상 인터페이스만 사용하라는 것은 아니다. 확장성이 필요할 때 문제이고, 적합한 인터페이스가 없다면 당연히 클래스로 참조해야 한다. 인터페이스 구현 메소드외 특별한 메소드를 포함한 클래스는 인터페이스로 선언할 수 없다. 하지만 이러한 경우는 최소화 해야 한다.

결론

간단한 구조라도 인터페이스를 사용하는 것에 익숙해지는 게 좋을 것이다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

블로그 시작

Mac OS Minikube 설치