배열은 본질적으로 동질적이다
배열(array)은 정의상 동질적(homogeneous)이라는 특성을 가집니다. 즉, 하나의 배열에는 반드시 같은 타입의 데이터만 저장해야 합니다. 그렇다면 서로 다른 타입의 데이터를 하나의 배열에 저장하고 싶다면 어떤 방법을 사용해야 할까요?
C 언어에서의 해결 방법: 공용체(Union) 활용
C 언어와 같은 전통적인 언어에서는 공용체(union)를 사용하여 서로 다른 타입들을 인위적으로 하나의 타입으로 묶을 수 있습니다. 그런 다음 이 새로운 타입을 기반으로 배열을 정의하면 됩니다.
여기서 중요한 점은, 배열 요소가 실제로 어떤 종류의 객체를 담고 있는지를 태그(tag)가 결정한다는 것입니다. 다음은 이러한 구조의 예시입니다.
struct Vehicle {
int id;
union {
Bus b;
Bike c;
Car d;
}
};태그 규약(Tag Convention)
프로그래머는 id 태그를 어떻게 사용할지에 대한 규약을 직접 정해야 합니다. 예를 들어, id 값이 0이면 해당 Vehicle 객체가 실제로는 Bus라는 의미로 약속하는 식입니다.
메모리 낭비 문제
공용체는 Bus, Bike, Car 중 가장 큰 타입에 맞춰 메모리를 할당합니다. 따라서 객체들의 크기 차이가 클 경우, 작은 객체를 저장할 때도 큰 객체만큼의 메모리가 필요하게 되어 상당히 비효율적일 수 있습니다.
객체 지향 언어에서의 해결 방법: 상속(Inheritance) 활용
객체 지향 프로그래밍 언어에서는 상속(inheritance) 개념을 활용하여 이 문제를 훨씬 우아하게 해결할 수 있습니다.
예를 들어 Vehicle이라는 부모 클래스를 정의하고, Bus, Bike, Car 같은 모든 타입을 이 클래스의 하위 클래스(sub-class)로 만듭니다. 그러면 Vehicle 타입으로 선언된 배열은 자연스럽게 모든 하위 클래스의 객체까지 함께 저장할 수 있습니다.
이러한 다형성(polymorphism) 특성 덕분에 단 하나의 배열 안에 여러 타입의 데이터를 손쉽게 저장할 수 있으며, C 언어의 공용체 방식보다 더 안전하고 유연한 코드 작성이 가능합니다.