적당한 인터페이스 자료형이 있다면 인자나 반환값, 변수, 그리고 필드의 자료형은 클래스 대신 인터페이스로 선언하자.
// 인터페이스를 자료형으로 사용하고 있는 바람직한 예
List<Subscriber> subscribers = new Vector<Subscriber>();
// 클래스를 자료형으로 사용하는, 나쁜 예제
Vector<Subscriber> subscribers = new Vector<Subscriber>();
인터페이스를 자료형으로 쓰는 습관을 들이면 프로그램은 더욱 유연해 진다.
· 어떤 객체의 실제 구현을 다른것으로 바꾸고 싶을 때, 호출하는 생성자 이름만 다른 클래스 이름으로 바꾸거나, 호출하는 정적 팩토리 메소드만 다른 것으로 바꿔주면 된다.
List<Subscriber> subscribers = new ArrayList<Subscriber>();
(주의) 가령 원래 구현이 인터페이스의 일반 규약에 없는 기능을 하고 원래코드가 그 기능을 사용하고 있을 때, 새로운 구현도 해당 기능을 동일하게 제공해야한다.
특별한 기능을 이용하도록 코드를 작성했다면, 변수를 선언할 때 그 사실을 주석으로 남겨야 한다.
적당한 인터페이스가 없는 경우 객체를 클래스로 참조하는 것이 당연하다.
· String과 BigInteger의 경우 대부분 final인 경우가 많고, 대응되는 인터페이스도 거의 없다.
해당 값은 당연히 인자나 변수, 필드, 반환 값의 자료형으로 사용할 수 있다.
인터페이스 대신 클래스를 핵심 자료형으로 사용하는 프레임워크에 속한 객체의 경우에도 적당한 인터페이스는 찾을 수 없다.
· 클래스 기반 프레임 워크에 속한 객체는 구현 클래스 대신 abstract로 선언되는 기반 클래스로 참조하는것이 바람직 하다.
· java.util.TimerTask
결론
· 인터페이스가 있다면, 객체를 참조할 때 인터페이스를 사용하면 훨씬 유연한 프로그램을 만들 수 있다. 인터페이스가 없는 경우 필요한 기능을 제공하는 클래스 가운데 가장 일반적인 클래스를 클래스 계층 안에서 찾아서 이용해야 한다.
'IT > Programming' 카테고리의 다른 글
<Effective Java> RULE 50 다른 자료형이 적절하다면 문자열 사용은 피하라 (0) | 2023.04.26 |
---|---|
<Effective Java> RULE 51 문자열 연결 시 성능에 주의하라 (0) | 2023.04.26 |
<Effective Java> RULE 53 리플렉션 대신 인터페이스를 이용하라 (0) | 2023.04.26 |
<Effective Java> RULE 54 네이티브 메서드는 신중하게 (0) | 2023.04.26 |
<Effective Java> RULE 55 신중하게 최적화 하라 (0) | 2023.04.26 |