From 77176c8700ec8d55e1995a1fcb5cabe3e38d3954 Mon Sep 17 00:00:00 2001 From: kdomo Date: Fri, 1 Sep 2023 20:37:55 +0900 Subject: [PATCH] =?UTF-8?q?[Item64]:=20=EA=B0=9D=EC=B2=B4=EB=8A=94=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=EB=A5=BC=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=B4=20=EC=B0=B8=EC=A1=B0=ED=95=98?= =?UTF-8?q?=EB=9D=BC=20(#145)(=EB=8F=84=EB=AA=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\354\241\260\355\225\230\353\235\274.md" | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 "Ch09/item64/\352\260\235\354\262\264\353\212\224_\354\235\270\355\204\260\355\216\230\354\235\264\354\212\244\353\245\274_\354\202\254\354\232\251\355\225\264_\354\260\270\354\241\260\355\225\230\353\235\274.md" diff --git "a/Ch09/item64/\352\260\235\354\262\264\353\212\224_\354\235\270\355\204\260\355\216\230\354\235\264\354\212\244\353\245\274_\354\202\254\354\232\251\355\225\264_\354\260\270\354\241\260\355\225\230\353\235\274.md" "b/Ch09/item64/\352\260\235\354\262\264\353\212\224_\354\235\270\355\204\260\355\216\230\354\235\264\354\212\244\353\245\274_\354\202\254\354\232\251\355\225\264_\354\260\270\354\241\260\355\225\230\353\235\274.md" new file mode 100644 index 0000000..5f57a74 --- /dev/null +++ "b/Ch09/item64/\352\260\235\354\262\264\353\212\224_\354\235\270\355\204\260\355\216\230\354\235\264\354\212\244\353\245\274_\354\202\254\354\232\251\355\225\264_\354\260\270\354\241\260\355\225\230\353\235\274.md" @@ -0,0 +1,45 @@ +# item64. 객체는 인터페이스를 사용해 참조하라 + +### 서론 +Item51에서 `매개변수 타입으로 클래스가 아니라 인터페이스를 사용하라`고 했다.
+이 조언을 `객체는 클래스가 아닌 인터페이스로 참조하라`고까지 확장 할 수 있다.
+**적합한 인터페이스만 있다면 매개변수뿐 아니라 반환값, 변수, 필드를 전부 인터페이스 타입으로 선언하라.**
+ +객체의 실제 클래스를 사용해야 할 상황은 '오직' 생성자로 생성할 때뿐이다. + +### Set 인터페이스를 구현한 LinkedHashSet 변수 선언 예 +```java +/** 좋은 예 - 인터페이스 타입으로 사용 */ +Set sonSet = new LinkedHashSet<>(); +``` + +```java +/** 나쁜 예 - 클래스 타입으로 사용 */ +LinkendHashSet sonSet = new LinkedHashSet<>(); +``` +**인터페이스 타입으로 사용하는 습관을 길러두면 프로그램이 훨씬 유연해질 것이다.** + +### 인터페이스 타입의 장점 +- 인터페이스 타입을 사용하면 클라이언트 코드를 수정하지 않고도 참조 객체를 변경할 수 있다. +- 다른 타입의 객체를 사용하더라도 컴파일에러/런타임에러에 대한 걱정을 하지 않아도 된다. + +### 인터페이스 타입의 단점 +- 인터페이스 타입에 선언된 메서드를 구현한 메서드만 사용이 가능하다. +- 특정 구현체의 내부 메서드를 사용할 수 없다. + +### 그럼에도 클래스를 참조해야 하는 경우 +1. 값 타입인 경우 + - String, Integer, Long과 같이 값 타입에 대해서는 인터페이스를 사용할 수 없으니 클래스를 참조해야 한다. + - 또한 Integer, Long과 같은 타입을 사용할 때는 Number와 같은 상위 타입을 사용하지 말아야 한다.
+ **형변환이 발생 할 때 특정 데이터가 절삭되어 다른 결과가 발생 할 수 있기 때문이다.** + - 이런 경우에는 인터페이스나 상위타입 보다는 본래의 클래스로 참조하는 것이 좋다. +2. 인터페이스에 없는 메서드를 사용 할 경우 + - PriorityQueue 클래스에는 Queue 인터페이스에는 없는 comparator 메서드를 제공한다. + - 클래스 타입을 직접 사용하는 경우에는 추가 메서드를 사용해야 하는 경우로 최소화 하는 것이 좋다. + +### 정리 +- 인터페이스나 추상클래스를 구현하는 클래스를 사용할 때는 참조 변수를 인터페이스나 추상클래스로 사용하자 +- 인터페이스나 추상클래스 타입으로 참조 변수를 사용하면 참조 객체를 바꿔도 안전하다 +- 값 타입을 사용하는 경우에는 클래스 타입의 참조변수를 사용해야 한다. +- 인터페이스에는 없는 메서드를 사용할 때는 클래스 타입의 참조변수를 사용해야 한다. +- 적합한 인터페이스가 없다면 계층구조 중 필요한 기능을 만족하는 가장 덜 구체적인 상위 타입을 사용해야 한다. \ No newline at end of file