객체의 참조를 사용하면 배열에 여러 자료형을 담을 수 있다
기본적으로 배열은 같은 타입의 원소만을 담을 수 있다.
int iarr[2] = {17, 34};
float farr[2] = {3.14, 1.59};
bool barr[2] = {true, false};
char carr[2] = {'a', 'b'};
하지만 스크립트 언어 (e.g. Ruby, Python, JavaScript, etc)에서의 배열을 보면 여러가지 자료형을 한 번에 담을 수 있다.
# ruby
arr = [17, 3.14, true, 'a', "string", nil, method(:foo)]
이를 보면 스크립트 언어의 배열은 타입이 없는건가 싶지만, 사실은 모든 값들이 같은 클래스를 상속받고 있기 때문인데 바로 Object
이다 (코드마다 구현은 다를 수 있지만 개념은 같다). 루비의 경우 null
과 함수를 포함한 거의 모든 값들이 객체에 속하는데, 이들은 모두 Object
의 하위 클래스에 속한다.
arr = [17, 3.14, true, 'a', "string", nil, method(:foo)]
for v in arr do
puts "'#{v.inspect}' in Object? #{v.kind_of? Object}"
end
# '17' in Object? true
# '3.14' in Object? true
# 'true' in Object? true
# 'a' in Object? true
# 'string' in Object? true
# 'nil' in Object? true
# '#<Method: Object#foo>' in Object? true
배열의 타입이 Object
라면, Object
를 상속받는 그 어떤 값들도 배열에 담아낼 수 있다. 이는 스크립트 언어에만 국한된 기능은 아니며, C언어에서도 void*
를 사용해 다양한 타입의 포인터를 하나의 배열처럼 다루는 것이 가능하다. 다만 이는 객체 기반 구조가 아닌 메모리 주소 수준의 접근이다.
확장 🌱
- 왜 배열은 같은 타입의 데이터만 저장할 수 있을까? → 250518202725
- 배열은 한 블럭의 메모리가 미리 할당되는데, 이와 관련 있어 보임
-
void*
를 사용한 타입 불문 배열 구현
관련 노트 📘
- n/a