Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++와 Java의 객체 슬라이싱(Object Slicing)이란? 개념과 예제로 쉽게 이해하기

객체 슬라이싱(Object Slicing)이란?

객체 슬라이싱은 파생 클래스(자식 클래스)의 객체를 기반 클래스(부모 클래스)의 인스턴스에 할당할 때 발생하는 현상을 말합니다. 이 과정에서 파생 클래스가 가지고 있던 메서드나 멤버 변수들이 사라지게 되는데, 마치 정보가 '잘려 나간(slice away)' 것처럼 표현되어 객체 슬라이싱이라는 이름이 붙었습니다.

구체적인 예시를 통해 살펴보겠습니다.

class Foo {
   int a;
};
class Bar : public Foo {
   int b;
};

위 코드에서 BarFoo를 상속받기 때문에 두 개의 멤버 변수 ab를 가지게 됩니다.

객체 슬라이싱이 발생하는 과정

이제 Bar 타입의 변수를 하나 만들고, 그 값을 Foo 타입의 변수에 할당해 보겠습니다.

Bar bar;
Foo foo = bar;

이 경우 bar 객체가 가지고 있던 멤버 변수 b에 대한 정보는 복사되지 않고 사라집니다. 기반 클래스인 Foo는 자신이 정의한 멤버만 저장할 수 있는 공간을 가지고 있기 때문입니다. 이처럼 파생 클래스 고유의 데이터가 잘려나가는 현상을 멤버 슬라이싱(member slicing)이라고 부릅니다.

주의할 점

C++에서는 객체를 값으로 복사하거나 할당할 때 이러한 슬라이싱이 쉽게 발생할 수 있습니다. 다형성(polymorphism)을 활용하려면 포인터나 참조(&)를 사용하여 객체를 전달하는 것이 좋습니다. 반면 Java에서는 모든 객체가 참조로 처리되기 때문에 C++처럼 값 복사에 의한 객체 슬라이싱 문제는 발생하지 않습니다.