본문 바로가기

TIL

[TIL] 🌱 2023.04.25 - 상속과 컴포지션

🛹 목표

목표 난이도 달성 여부
이펙티브 자바 ITEM 17, 18, 19
- 변경 가능성을 최소화하라
- 상속보다는 컴포지션을 사용하라
- 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라
✔️
패스트 캠퍼스 강의 듣기
✔️
알고리즘 문제풀이 ✔️

📋 공부 내용 & 기록

이펙티브 자바

 

불변 클래스를 만들기 위한 규칙

  • 객체의 상태를 변경하는 메서드를 제공하지 않는다.
  • 모든 필드를 final로 선언한다. - 설계자의 의도를 명확히 드러낼 수 있다.
  • 모든 필드를 private으로 선언한다.
  • 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다.

불변 클래스의 장점

  • Thread-Safe 하여 따로 동기화할 필요 없음
  • 불변 객체는 자유롭게 공유할 수 있음은 물론, 불변 객체끼리는 내부 데이터를 공유할 수 있다.

상속 VS 컴포지션

 

💠 상속을 자제하고 합성(Composition)을 이용하자

상속과 합성 개념 정리 프로그래밍을 할때 가장 신경 써야 할 것 중 하나가 바로 코드 중복을 제거하여 재사용 함으로써 변경, 확장을 용이하게 만드는 것이다. 그런 관점에서 상속과 합성은 객

inpa.tistory.com

상속(Inheritance)의 장점과 단점

장점

  • 코드를 재사용함으로써 중복을 줄일 수 있음
  • 유연성 및 확장성 증가

단점

  • 캡슐화를 깨뜨린다.
  • 하위 클래스에서 상위 클래스를 강하게 의존하기 때문에  변화에 유연한 대처가 어렵다. -> 컴파일 시점에  의존성을 파악할 수 있음
  • 클래스간 결합도가 높다.

상속은 언제?

두 클래스 간의 관계가 is-a 관계일 때만 사용할 것 그러한 관계가 아니라면 컴포지션을 활용하는 편이 좋을 수 있다.

 

컴포지션(Composition) - 조합

한 클래스가 다른 클래스를 포함하고 있는 관계로 상속과는 대조되는 개념이다.

상속이 is-a 관계라면 컴포지션은 has-a 관계로 한 클래스가 다른 클래스를 구성요소로 포함하고 있으며, 구성요소의 메서드 및 필드를 사용할 수 있다. 

 

장점

  • 필드로 가지고 있는 클래스의 메서드를 호출함으로써 캡슐화를 유지할 수 있다.
  • 런타임 시점에 의존성을 주입하기에 유연하다.

정리

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

 

동기 VS 비동기

Synchronous (동기)

  • 작업을 수행할 때, 해당 작업이 완료될 때까지 기다리고, 결과값을 반환받은 후에 다음 작업을 수행하는 방식 -> 작업이 순서대로 실행되는 방식
  • 작업 수행시간이 길어지면 다음 작업을 수행할 없고, 대기시간이 발생하여 성능에 문제가 발생할 있다.

Asynchronous(비동기)

  • 작업을 수행할 때, 해당 작업이 완료되지 않았더라도 결과값을 기다리지 않고 다음 작업을 수행하는 방식을 의미-> 작업이 순서대로 실행되지 않고, 비동기적으로 실행되는 방식 
  • 작업 수행시간이 길어져도 다른 작업을 수행할 있으므로 대기 시간이 없고, 성능이 향상될 있다. 하지만 작업의 순서를 보장하지 않으므로 순서가 중요한 작업에는 적합하지 않을 있다.

 


📌 내일 해야할 일

자바 @Async 조사