객체 슬라이싱(Object Slicing)이란?
객체 슬라이싱은 파생 클래스(자식 클래스)의 객체를 기반 클래스(부모 클래스)의 인스턴스에 할당할 때 발생하는 현상을 말합니다. 이 과정에서 파생 클래스가 가지고 있던 메서드나 멤버 변수들이 사라지게 되는데, 마치 정보가 '잘려 나간(slice away)' 것처럼 표현되어 객체 슬라이싱이라는 이름이 붙었습니다.
구체적인 예시를 통해 살펴보겠습니다.
class Foo {
int a;
};
class Bar : public Foo {
int b;
};
위 코드에서 Bar는 Foo를 상속받기 때문에 두 개의 멤버 변수 a와 b를 가지게 됩니다.
객체 슬라이싱이 발생하는 과정
이제 Bar 타입의 변수를 하나 만들고, 그 값을 Foo 타입의 변수에 할당해 보겠습니다.
Bar bar; Foo foo = bar;
이 경우 bar 객체가 가지고 있던 멤버 변수 b에 대한 정보는 복사되지 않고 사라집니다. 기반 클래스인 Foo는 자신이 정의한 멤버만 저장할 수 있는 공간을 가지고 있기 때문입니다. 이처럼 파생 클래스 고유의 데이터가 잘려나가는 현상을 멤버 슬라이싱(member slicing)이라고 부릅니다.
주의할 점
C++에서는 객체를 값으로 복사하거나 할당할 때 이러한 슬라이싱이 쉽게 발생할 수 있습니다. 다형성(polymorphism)을 활용하려면 포인터나 참조(&)를 사용하여 객체를 전달하는 것이 좋습니다. 반면 Java에서는 모든 객체가 참조로 처리되기 때문에 C++처럼 값 복사에 의한 객체 슬라이싱 문제는 발생하지 않습니다.