프로그래밍 PROGRAMMING/파이썬 PYTHON

[PYTHON] 파이썬의 컨테이너(container) 객체란

매운할라피뇽 2022. 3. 3. 14:42
반응형

파이썬 컨테이너 객체란

 

파이썬에서 컨테이너란 데이터의 종류에 무관하게 저장할수 있는 자료형(Data Type)을 저장한 모델을 의미합니다. 약간 어려워보이는 말이긴 하지만 간단히 설명하면 데이터의 자료형에 상관없이 저장이 가능한 객체란 의미예요. 예를 들면 문자열(str), 튜플(tuple), 리스트(list), 딕셔터리(dictionary), 집합(set) 등은 타입에 무관하게 저장이 가능한 컨테이너 객체들이고 정수, 실수, 복소수 등은 타입이 고정되어 있는 단일 종류(Literal)한 자료형입니다. 

 

더 간단히 말하면 컨테이너 객체는 컨테이너 타입을 상속한 객체로서 여러 데이터 객체에 대한 메모리 참조 정보를 담고 있는 객체라고 할 수 있습니다. 예를 들어 리스트가 다음과 같이 할당되어 있다면, var 는 리스트 타입의 컨테이너 객체라고 할 수 있습니다. 이 컨테이너 객체는 정수형과 문자, 그리고 문자열로 구성된 데이터를 참조하고 있는 객체입니다.

 

예컨데 파이썬에서 데이터를 변수에 할당한다는 의미는 해당 변수에 메모리에 대한 참조 정보를 가리킨다는 의미로 해석할 수 있습니다. 아래와 같이 int1에 정수 1을 할당한다는 것은 1을 담고 있는 메모리의 정보 2165104273712를 int1에 담아주는 것을 의미합니다. 

>>> int1 = 1
>>> id(int1)
2165104273712

 

컨테이너 객체는 객체가 가지고 있는 데이터들을 가리키는 주소를 가지고 있는 객체입니다. 예를 들어 리스트형 객체란 특정 데이터의 주소를 리스트 형식으로 가지고 있는 객체를 의미합니다. 컨테이너 객체는 따라서 특정 데이터 타입과는 무관하게 여러 데이터를 참조하는 주소를 담을 수 있습니다.

 

컨테이너 객체는 무언가를 담고 있기 때문에 컨테이너 객체에 필수적일 수 있는 __contains__ 메소드를 가지고 있습니다.

 

>>> var = [1, 2, 5, 1, '1', 'create']
>>> var
[1, 2, 5, 1, '1', 'create']

 

따라서 이 컨테이너 객체들 내의 데이터를 확인하기 위해 __contains__ 메소드를 아래와 같이 사용이 가능합니다. 

 

>>> var = [1, 2, 5, 1, '1', 'create']
>>> var
[1, 2, 5, 1, '1', 'create']
>>> var.__contains__(1)
True
>>> var.__contains__(12)
False
>>> var.__contains__(2)
True
>>> var.__contains__('5')
False
>>> var.__contains__('1')
True

 

그럼 특정 자료형이 컨테이너 객체인지 아닌지 어떻게 확인할 수 있을까요?

 

컨테이너 객체를 확인하기 위해서는 기존 자료형을 확인하는 type 함수로는 확인할 수 없습니다. 대신 issubclass 함수를 사용해야 합니다. 

 

type 함수로 데이터를 확인하면 아래와 같은 결과가 리턴됩니다.

 

>>> type(1)
<class 'int'>
>>> type(1.22)
<class 'float'>
>>> type({1, 2, 3})
<class 'set'>
>>> type({1 : 123, 2: 321})
<class 'dict'>
>>> type('test')
<class 'str'>
>>> type([1, 2, 3])
<class 'list'>
>>> type((1, 2))
<class 'tuple'>

 

issubclass함수는 issubclass(X, Y)일 때, X 가 Y의 속성을 상속했는지 여부를 확인하여 True 혹은 False를 리턴해줍니다. 위의 결과에서 보여진 데이터 타입의 클래스를 가지고 issubclass 함수에 넣고 비교하여 컨테이너 객체인지를 확인할 수 있습니다. 

 

>>> from collections import Container

>>> issubclass(int, Container)
False
>>> issubclass(float, Container)
False
>>> issubclass(set, Container)
True
>>> issubclass(dict, Container)
True
>>> issubclass(str, Container)
True
>>> issubclass(list, Container)
True
>>> issubclass(tuple, Container)
True

 

위에서 볼 수 있듯이 정수형(int)나 실수형(float)형은 container 를 상속하지 않은 자료형입니다. 반대로 문자열(str), 튜플(tuple), 리스트(list), 딕셔터리(dictionary), 집합(set) 은 container를 상속한 자료형으로, container에 정의된 특징들을 공유합니다.  이처럼 파이썬은 지정된 이들 객체들을 범용 내부 컨테이너로서 정의하고 사용하고 있습니다.

 

 

 

 

반응형