상속 vs 컴포지션: 메모리

상속과 컴포지션의 메모리 할당 차이는?

  • 상속: 개체 생성 시 부모 + 자식이 메모리 한 덩어리(연속) 로 할당됨
  • 컴포지션: 부품 개체를 new 할 때마다 각각 별도 메모리 덩어리가 생성됨 (흩어짐)

캐시 관점에서 상속이 성능에 유리한 이유는?

  • 캐시 메모리는 연속된 블록 단위(캐시 라인)로 메모리를 읽음
  • 상속 개체는 연속된 한 덩어리라 한 번에 캐시에 로드될 확률이 높음
  • 컴포지션 개체는 부품들이 흩어져 있어 여러 번 메모리에 접근(버스 사용)해야 함 → 성능 불리
  • 또한 메모리 할당·해제가 많을수록 성능에 불리함
  • 결론: 확장성은 컴포지션이 좋고, 성능은 상속이 좋음

다음 코드에서 new BB()를 하면 몇 개의 메모리 블록이 할당되는가?

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();
4개
  • BB + 상속된 B → 한 덩어리 1개
    • 그 안의 B가 가진 a0 = new A() → A 1개
  • BB의 컴포지션 b = new B() → B 1개
    • b가 가진 a0 = new A() → A 1개
  • a1null이라 메모리를 할당하지 않음
  • 합계: 1 + 1 + 1 + 1 = 4

0건의 항목