본문 바로가기
public void static main()/Book

[Effective Java] 아이템 18

by 햄리뮤 2023. 1. 24.
반응형

으아아ㅏㅇ 너무 많이 남았어!

[책 규칙]

노란색 - 자세히 알아보고싶은 부분

초록색 - 핵심 개념 (블로그 정리시는 검은색으로!)

빨간색 - 무슨말인지 모르겠는 부분

[아이템 18] 상속보다는 컴포지션을 사용하라

상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아니다! 잘못 사용하면 오류를 내기 쉽다!

컴포지션(composition)?

  • Has-a 관계를 구현하기 위한 설계 기술. (상속은 is-a 관계)
  • 기존 클래스를 확장하는 대신 새로운 클래스를 만들고 private 필드로 기존 클래스의 인스턴스를 참조하는 방법을 통해 기능을 확장 시키는 것! 
    • 새로운 클래스의 인스턴스 메서드들은 private 필드로 참조하는 기존 클래스의 대응하는 메서드(forwarding method)를 호출해 그 결과를 반환하며, 이를 forwarding(전달) 이라 한다. 이렇게 구현하면 새로운 클래스는 기존 클래스의 내부 구현 방식의 영향에서 벗어날 수 있으며, 기존 클래스에 새로운 메서드가 추가되더라고 전혀 영향을 받지 않는다.

래퍼 클래스 

  • 자바의 자료형은 크게 기본 타입(primitive type)과 참조 타입(reference type)으로 나누어진다. 대표적으로 기본 타입은 char, int, float,  double, boolean 등이 있고, 참조 타입은 class, interface 등이 있는데 프로그래밍을 하다 보면 기본 타입의 데이터를 객체로 표현해야 하는 경우가 종종 있다. 이럴때에 기본 자료 타입(primitive type)을 객체로 다루기 위해서 사용하는 클래스들을 래퍼 클래스(wrapper class)라 한다.
  • 단점
    • 래퍼 클래스의 단점은 거의 없지만, 래퍼클래스가 콜백(callback) 프레임워크와는 어울리지 않는다는 점만 주위해라! 콜백 프레임워크에서는 자기 자신의 참조를 다른 객체에 넘겨서 다음 호출(콜백)때 사용하도록 한다. 내부 객체는 자신을 감싸고 있는 래퍼의 존재를 모르니 대신 자신(this)의 참조를 넘기고 콜백 때는 래퍼가 아닌 내부 객체를 호출하게 된다. 이를 SELF문제라고 한다. 전달 메서드가 성능에 주는 영향이나 래퍼 객체가 메모리리 사용에 주는 영향을 걱정하는 사람도 있지만, 실전에서는 둘 다 별다른 영향을 주지 않았다.

래퍼 클래프의 종류

기본 타입 (primitive type) 래퍼 클래스 (wrapper class)
byte Byte
char Character
int Integer
float Float
double Double
boolean Boolean
long Long
short Short

래퍼 클래스 구조

https://coding-factory.tistory.com/547

박싱(boxing)과 언박싱(unboxing)

래퍼 클래스(wrapper class)는 산술 연산을 위해 정의된 클래스가 아니므로, 인스턴스에 저장된 값을 변경할 수 없다.

단지, 값을 참조하기 위해 해로운 인스턴스를 생성하고, 생성된 인스턴스의 값만을 참조할 수 있다.

 

 

http://www.tcpschool.com/java/java_api_wrapper

 

 

핵심 정리
상속은 강력하지만 캡슐화를 해친다는 문제가 있다. 상속은 상위 클래스와 하위 클래스가 순수한 is-a관계일 때만 써야 한다. is-a 관계일 때도 안심할 수만은 없는 게, 하위 클래스의 패키지가 상위 클래스와 다르고, 상위 클래스가 확장을 고려해 걸계되지 않았다면 여전히 문제가 될 수 있다. 상속의 취약점을 피하려면 상속 대신 컴포지션과 전달을 사용하다. 특히 래퍼 클래스로 구현할 적당한 인터페이스가 있다면 더욱 그렇다. 래퍼 클래스는 하위 클래스보다 견고하고 강력하다.

 

1. 아이템 개념

  • 컴포지션
    • 기존 클래스를 확장하는 대신 새로운 클래스를 만들고 private 필드로 클래스의 인스턴스를 참조하는 방법을 통해 기능을 확장 시키는 것! 

2. 필요한 이유 (장점)

  • 컴포지션을 사용해 구현하게 되면 개발자가 원하는 메서드만 클라이언트에게 공개할 수 있다.
  • 상위 클래스의 내부 구현을 숨길 수 있다.
  • Java 에서 지원하지 않는 다중상속의 목적을 달성할 수 있다.
  • 상위 클래스에서 제공하는 메서드를 더 나은 버전으로 개설할 수 있다.
  • 참조하고 있는 인스턴스 변수를 변경해 프로그램을 동적으로 변경할 수 있다.
  • 상위 클래스의 메서드 형태와 관계 없이 유연하게 하위 클래스의 메서드를 정의할 수 있다.

3. 아이템 개념의 반대 개념이나 관련 개념

  • 상속
    • 캡슐화를 깨뜨리는 치명적인 단점이 있다. 상위클래스의 변수와 메소드가 하뤼클래스에게 노출되기 때문이다. 이에 따라 하위 클래스는 상위 클래스에게 강하게 결합되고, 의존하게 되며 상위클래스의 내부 구현이 달라지면, 수정사항이 없는 하위클래스가 오동작 할 수 있다.
    • 상속은 반드시 하위 클래스가 상위 클래스의 '진짜' 하위 타입인 상황에서만 쓰여야 한다. 다르게 말하면, 클래스 B가 클래스 A와 is-a 관계일 때만 클래스 A를 상속해야 한다. 클래스 A를 상속하는 클래스 B를 작성하려 한다면 "B가 정말 A인가?" 라고 자문해보자! "그렇다"고 확신할 수 없다면 B는 A를 상속해서는 안 된다.

4. 실무에서는 어떤식으로 사용되는가 (실제 코드 사용예시)

  • 컴포지션을 써야하는 상황에서 상속을 잘못 하용한 케이스가 자바 플랫폼 라이브러리에도 존재한다. 예를 들어 Stack은 Vector가 아니기 때문에 상속했으면 안됐다. 또한 Properties도 HashsTable을 상속해서는 안됐다.
  • Stack이 Vertor를 상속한 탓에 Stack 클래스에는 push, pop 메서드와 get, set 이 모두 존재하게 되버렸다. 컴포지션을 사용했더라면 이러한 문제가 발생하지 않았을 것이다.

 

 

아~~ 힘들어~ 오늘도 지식을 주신 파워 블로거분들에게 감사를!

 

 

https://ch4njun.tistory.com/247

 

[아이템 18] 상속보다는 컴포지션을 사용하라

알다시피 상속은 코드 재사용을 구현하기 위한 강력한 방법이다. 하지만 잘못 사용할 경우 오류를 내기 쉬운 프로그램을 만들게 된다. 이러한 문제는 상위 클래스와 하위 클래스를 동일한 개발

ch4njun.tistory.com

http://www.tcpschool.com/java/java_api_wrapper

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

https://coding-factory.tistory.com/547

 

[Java] 래퍼 클래스(Wrapper Class)란 무엇인가? (박싱, 언박싱)

래퍼 클래스란(Wrapper Class)? 자바의 자료형은 크게 기본 타입(primitive type)과 참조 타입(reference type)으로 나누어집니다. 대표적으로 기본 타입은 char, int, float, double, boolean 등이 있고 참조 타입은 cla

coding-factory.tistory.com

https://hpotter1993.tistory.com/36

 

상속과 컴포지션

포스트를 작성하는 목적 상속과 컴포지션(조합) 이란? 상속 Composition(조합) 포스트를 작성하며 알게 된점 Reference 포스트를 작성하는 목적 상속과 컴포지션(조합)의 차이점에 대해서 알아본다. 개

hpotter1993.tistory.com

https://dahye-jeong.gitbook.io/java/java/effective_java/2021-02-12-use-composition

 

ITEM 18: 상속보단 컴포지션을 사용해라 - JAVA

Composition(컴포지션)이란 기존 클래스를 확장하는 대신, 새로운 클래스를 만들고 private 필드로 기존 클래스의 인스턴스를 참조하는 방법을 통해 기능을 확장시키는 것이다. 새로운 클래스의 인스

dahye-jeong.gitbook.io

 

 

** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.

이곳 저곳에서 구글링한 것과 강의 들은 내용이 정리가 되었습니다.

그림들은 그림밑에 출처표시를 해놓았습니다.

문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **

반응형

'public void static main() > Book' 카테고리의 다른 글

[Effective Java] 아이템 32  (1) 2023.01.25
[Effective Java] 아이템 23  (0) 2023.01.24
[Effective Java] 아이템 5  (0) 2023.01.24
[Effective Java] 아이템 17  (0) 2023.01.18
[Effective Java] 아이템 15  (0) 2023.01.18

댓글