상속 vs 컴포지션: 메모리

상속 vs 컴포지션 선택 시 4가지 기준 에서 기계상 차이

상속과 메모리

상속은 개체 생성 시 메모리 한 덩어리

컴포지션은 new 할 때 마다 각각 메모리 덩어리 생성

메모리 덩어리와 성능

CPU와 메모리 사이의 데이터 전송이 필요함

  • 버스가 통신을 담당

버스 로 통신하지 않으면 성능 향상 가능

CPU 내부에 캐시 메모리

  • 메모리와 버스 를 통해 통신할 필요가 없어서 성능 향상

캐시 라인

  • 캐시 메모리는 메모리에서 한 번에 연속된 블럭 단위로 읽음
  • 이 단위를 캐시 라인 이라고 부름

상속으로 생성한 개체는 메모리에 연속으로 한 덩어리에 들어가기 때문에 한 번에 캐시 메모리에 로드할 확률이 높음

컴포지션으로 생성한 개체는 부품 개체의 메모리 덩어리가 흩어져 있기 때문에 캐시 메모리에 로드할 때 여러 번 메모리에 접근해야 할 확률이 높음

  • 버스 를 여러 번 사용하게 됨

메모리 할당, 해제 중 언어의 런타임 구조에 따라 느린 것이 있음

  • 할당과 해제를 많이 할 수록 성능에 불리함

결론적으로 컴포지션이 확장성은 좋으나 성능은 상속이 좋음

복습 퀴즈

public class A {  
}  
  
public class B {  
    private int count;  
    private A a0 = new A();  
    private A a1;  
}  
  
public class BB extends B {  
    private int length;  
    private B b = new B();  
}

new BB();를 하면 몇 개의 메모리 블록이 할당되나요?

BBB를 상속 받음

  • BBB는 하나의 덩어리로 생성 됨

BBB를 컴포지션으로 가짐

  • 상속도 하고 컴포지션으로 가지기도 하고

BA를 컴포지션으로 1개 가짐

  • a1은 새로운 메모리를 할당하지 않음 (null)

BB + B (상속) 1개

  • 여기의 B의 컴포지션 A 1개

BB의 컴포지션 B 1개

  • 여기싀 B의 컴포지션 A 1개

A: 총 4개

0건의 항목