객체의 참조를 사용하면 배열에 여러 자료형을 담을 수 있다

기본적으로 배열은 같은 타입의 원소만을 담을 수 있다.

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
Backlinks: