자바 JAVA

[JAVA]자바 - 상속과 컴포지션

스누징어 2021. 7. 26. 23:10

상속과 컴포지션

상속과 컴포지션, 재사용성

* 상속과 컴포지션은 재사용성을 위해 사용된다.

 

* 둘 중 어떤 걸 사용해도 구현은 가능하다. (대부분)

  특수한 상황에서 차이점이 나타나기도 한다. (성능, 관리 등등)

 

* 특별한 상황이 아니라면, 사람이 생각하는 것처럼 만드는게 좋다.

  사람이 생각하기 편하게 설계하는 것이 가독성도 높고, 이해가 편하기 때문이다.

  

 

성능

* 성능은 상속이 더 좋다.

 

* 상속은 객체 생성 시 메모리가 하나의 덩어리로 만들어진다.

  컴포지션각각 메모리가 생성되고 분산되어 있다. 

 

* 컴포지션의 분산된 메모리는 실행 성능의 큰 영향을 미친다.

  (CPU <-> 캐시메모리 <-> 메모리) 형태로 데이터가 전송되는데,

  캐시메모리는 사용할 메모리의 주변 메모리까지 한꺼번에 가져온다.

 

* 즉, 현재 사용한 메모리 주변에 다음 사용할 메모리가 있다면 

  캐시메모리에 이미 있기 때문에 바로 가져와서 계산한다. (빠르다)

 

* 상속메모리 할당과 해제가 한번만 일어난다.

  컴포지션각각의 객체마다 할당 해제가 일어난다.

  할당, 해제에서도 상속이 더 빠르다.

 

 

다형성

* 다형성을 사용하기 위해서는 상속이 꼭 필요하기 때문에

  컴포지션은 아예 사용할 수가 없다.

 

* 다형성이 필요하다면 무조건 상속을 사용한다.

 

유지보수

* 깊은 상속 관계에서 부모 클래스의 변경점이 있다면,

  모든 자식 클래스를 테스트해야한다.

  컴포지션도 바뀌면 테스트를 해야하지만, 

  의존성이 비교적 낮기 때문에 문제가 덜 생긴다.

 

* 컴포지션메서드 시그니쳐 중복이 생길 수 있다.

  상속은 메서드가 상속되므로 중복이 생기지 않지만,

  컴포지션을 캡슐화했다면 외부에서 보이지 않기 때문에

  클래스에서 컴포지션의 메서드를 부르는 메서드를 만들어야할 수도 있다.

  컴포지션은 이런 릴레이 함수가 생길 수 있다.

 

 

대다수의 경우

* 위에서 말한 케이스가 아니라면 솔직히 뭘 쓰던 비슷할 수 있다.

 

* 모호하게 들릴 수 있지만 상식적으로 공통적인 사고방식으로 설계하는게 좋다.

  일반적으로 분리되는 개념, 부품 조합같은 개념이면 컴포지션을 사용하고,

  상속개념, 하나의 통일체같은 개념이라면 상속을 사용하는게 좋다.

 

* 나중에 내 코드를 보거나 다른 사람과 협업할때,

  이해하기 쉬운 코드가 좋은 코드이다.

 

 

 

 

 

 

 

 

귀여운 그림은 쭐어님이 그리셨습니다.

반응형