아이템51에서 매개변수 타입으로 클래스가 아니라 인터페이스를 사용하라고 했는데, "객체는 클래스가 아닌 인터페이스로 참조하라"고 확장할 수 있다.
🍑 본론
적합한 인터페이스가 있다면 매개변수뿐 아니라 반환값, 변수, 필드를 모두 인터페이스 타입으로 선언하라
실제 클래스를 사용해야 할 상황은 '오직' 생성자로 생성할 때뿐
// 좋은 예
Set<Son> sonSet = new LinkedHashSet<>();
// 만약 구현 클래스를 교체하고자 한다면, 새 클래스의 생성자를 호출
Set<Son> sonSet = new HashSet<>();
// 나쁜 예
LinkedHashSet<Son> sonSet = new LinkedHashSet<>();
🔥 주의할 점
원래의 클래스가 인터페이스의 일반 규약 이외의 특별한 기능을 제공하며, 주변 코드가 이 기능에 기대어 동작한다면 새로운 클래스도 반드시 같은 기능을 제공해야 한다.
🔥 바꾸려고 하는 동기
원래의 것보다 성능이 좋거나 멋진 신기능을 제공하기 때문
🔥 적합한 인터페이스가 없다면 클래스로 참조해야 한다
String과 Big Integer 같은 값 클래스
값 클래스는 값을 표현하는데 주로 사용되는 클래스이며, 변경 불가능하고, 그 값으로 동일성을 정의하는 특징이 있음
Interger, Long, Double 처럼 박싱된 기본형 클래스가 모두 값 클래스
값 클래스를 여러 가지로 구현될 수 있다고 생각하고 설계하는 일은 거의 없기 때문에, 매개변수, 변수 필드, 반환 타입으로 사용해도 무방
클래스 기반으로 작성된 프레임워크가 제공하는 객체들
java.io의 FileOutputStream, javax.swing의 JButton, java.net의 Socket 이 대표적인 예시
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);
}
}
인터페이스에는 없는 특별한 메서드를 제공하는 클래스들
가장 대표적인 예시가 PriorityQueue ⇒ Queue 인터페이스에는 없는 comparator 메서드를 제공
위처럼 클래스 타입을 직접 사용하는 경우에는 추가 메서드를 꼭 사용해야 하는 경우로 최소화해야 하며, 절대 남발해서는 안됨
🍑 결론
적합한 인터페이스가 없다면 클래스의 계층구조 중 필요한 기능을 만족하는 가장 덜 구체적인(상위의) 클래스를 타입으로 사용하자
Chapter : 9. 일반적인 프로그래밍 원칙
Item : 64. 객체는 인터페이스를 사용해 참조하라
Assignee : Lainlnya
🍑 서론
아이템51에서 매개변수 타입으로 클래스가 아니라 인터페이스를 사용하라고 했는데, "객체는 클래스가 아닌 인터페이스로 참조하라"고 확장할 수 있다.
🍑 본론
🔥 주의할 점
원래의 클래스가 인터페이스의 일반 규약 이외의 특별한 기능을 제공하며, 주변 코드가 이 기능에 기대어 동작한다면 새로운 클래스도 반드시 같은 기능을 제공해야 한다.
🔥 바꾸려고 하는 동기
원래의 것보다 성능이 좋거나 멋진 신기능을 제공하기 때문
🔥 적합한 인터페이스가 없다면 클래스로 참조해야 한다
String
과Big Integer
같은 값 클래스클래스 기반으로 작성된 프레임워크가 제공하는 객체들
java.io
의FileOutputStream
,javax.swing
의JButton
,java.net
의Socket
이 대표적인 예시인터페이스에는 없는 특별한 메서드를 제공하는 클래스들
PriorityQueue
⇒ Queue 인터페이스에는 없는comparator
메서드를 제공🍑 결론
적합한 인터페이스가 없다면 클래스의 계층구조 중 필요한 기능을 만족하는 가장 덜 구체적인(상위의) 클래스를 타입으로 사용하자
Referenced by
-