개요
이펙티브 자바에서 나온 내용인데 자주 활용하지만, 면접때 왜? 라고 하면 떠오르지 않을 수 있기 때문에 회고.
가장 많이 쓰는 예시
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);
임의의 인터페이스를 만들고 그것을 구현한 구현체를 여러가지 종류 만들게 되면, 인터페이스로 선언하여 유연하게 다양한 동작을 처리할 수 있다.
그래도…
항상 인터페이스만 사용하라는 것은 아니다. 확장성이 필요할 때 문제이고, 적합한 인터페이스가 없다면 당연히 클래스로 참조해야 한다. 인터페이스 구현 메소드외 특별한 메소드를 포함한 클래스는 인터페이스로 선언할 수 없다. 하지만 이러한 경우는 최소화 해야 한다.
결론
간단한 구조라도 인터페이스를 사용하는 것에 익숙해지는 게 좋을 것이다.