peaches-book-study / effective-java

이펙티브 자바 3/E
0 stars 2 forks source link

Item 64. 객체는 인터페이스를 사용해 참조하라 #67

Open Lainlnya opened 2 months ago

Lainlnya commented 2 months ago

Chapter : 9. 일반적인 프로그래밍 원칙

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

Assignee : Lainlnya


🍑 서론

아이템51에서 매개변수 타입으로 클래스가 아니라 인터페이스를 사용하라고 했는데, "객체는 클래스가 아닌 인터페이스로 참조하라"고 확장할 수 있다.

🍑 본론

적합한 인터페이스가 있다면 매개변수뿐 아니라 반환값, 변수, 필드를 모두 인터페이스 타입으로 선언하라

실제 클래스를 사용해야 할 상황은 '오직' 생성자로 생성할 때뿐

// 좋은 예
Set<Son> sonSet = new LinkedHashSet<>();
// 만약 구현 클래스를 교체하고자 한다면, 새 클래스의 생성자를 호출
Set<Son> sonSet = new HashSet<>();

// 나쁜 예
LinkedHashSet<Son> sonSet = new LinkedHashSet<>();

🔥 주의할 점

원래의 클래스가 인터페이스의 일반 규약 이외의 특별한 기능을 제공하며, 주변 코드가 이 기능에 기대어 동작한다면 새로운 클래스도 반드시 같은 기능을 제공해야 한다.

🔥 바꾸려고 하는 동기

원래의 것보다 성능이 좋거나 멋진 신기능을 제공하기 때문

🔥 적합한 인터페이스가 없다면 클래스로 참조해야 한다

  1. StringBig Integer 같은 값 클래스

    1. 값 클래스는 값을 표현하는데 주로 사용되는 클래스이며, 변경 불가능하고, 그 값으로 동일성을 정의하는 특징이 있음
    2. Interger, Long, Double 처럼 박싱된 기본형 클래스가 모두 값 클래스
    3. 값 클래스를 여러 가지로 구현될 수 있다고 생각하고 설계하는 일은 거의 없기 때문에, 매개변수, 변수 필드, 반환 타입으로 사용해도 무방
  2. 클래스 기반으로 작성된 프레임워크가 제공하는 객체들

    1. java.ioFileOutputStream, javax.swingJButton, java.netSocket 이 대표적인 예시
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class JButtonExample {
        public static void main(String[] args) {
            JFrame frame = new JFrame("Button Example");
            JPanel panel = new JPanel();
            JButton button = new JButton("Click Me");
    
            button.addActionListener(e -> System.out.println("Button Clicked!"));
    
            panel.add(button);
            frame.add(panel);
            frame.setSize(300, 200);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    }
    
  3. 인터페이스에는 없는 특별한 메서드를 제공하는 클래스들

    1. 가장 대표적인 예시가 PriorityQueue ⇒ Queue 인터페이스에는 없는 comparator 메서드를 제공
    2. 위처럼 클래스 타입을 직접 사용하는 경우에는 추가 메서드를 꼭 사용해야 하는 경우로 최소화해야 하며, 절대 남발해서는 안됨

🍑 결론

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


Referenced by

-