[python] Collection

Shadis·2025년 8월 1일

python

목록 보기
5/13

Collection

list, str, set, dictionary, tuple 등 여러 데이터를 저장할 수 있는 자료형을 Collection이라고 부른다. 파이썬으로 코딩을 하다보면 이 Collection 자료형끼리의 형변환과 비교가 자유롭기도 하고 for문이나 len()함수, in 연산자에서의 사용법이 비슷하다는 것을 느낀다.

list1 = [1,2,3]
str1 = "123"

print(list1 == str1)

# > False
str1 = "123"
list1 = list(str1)

print(list1)
# > ['1', '2', '3']

왜 파이썬에서는 Collection끼리 호환이 잘 되는 것일까?

Collection 자료형의 Interface 상속 구조


(reference : https://sangmoonoh.medium.com/just-class-diagram-for-python-3-collections-abstract-base-classes-e1eafde6ad25)

위의 사진은 Collection 자료형의 Interface 상속 구조를 나타낸 것이다. list, tuple, str, range 등 여러 데이터를 저장할 수 있는 자료형이 모두 Iterable, Sized, Container을 상속한 Collection을 구현한 자료형이기 때문이다.

Collection 상위 class

Iterable

Iterable interface는 Iterable interface를 구현하는 객체들이 __iter__() 매직 메소드를 구체화하도록 한다. __iter__() 매직 메소드는 객체로 하여금 for문에서 주로 사용하는 Iterator 객체를 반환하게 하는 메소드이다.

list("str")와 같이 class 생성자를 통해 Collection 자료형끼리 형변환이 가능한 이유는 Collection interface를 구현한 class의 생성자가 Iteraotor 객체를 통해 객체를 생성하기 때문이다.

Iterable(반복 가능하다) 라는 것

일상 생활에서 반복이란 개념은 어떤 패턴이 연속적으로 똑같이 나타나는 것이다.
1, 2, 2, 3, 3, 3, 1, 2, 2, 3, 3, 3, 1, 2, 2, 3, 3, 3 이런식으로 말이다.

하지만 컴퓨터에서 반복 가능하다는 것은 반복문에 활용할 수 있다는 것이다.

반복문에 활용할 수 있기 위해서는 어떤 특징이 있어야 할까? 반복문에 활용하기 위해서는 자료형의 모든 element들을 중복되지 않게 한번씩 접근할 수 있어야 한다. 그리고 이를 위해서는 어떤 element에 접근했을 때 다음으로 접근할 element를 무엇으로 할지 분명하게 정할 수 있어야 한다.

Set과 Dictionary가 iterable?

List와 tuple이 iterable 자료형인 것은 자연스럽게 이해할 수 있다. 그냥 index 0부터 시작해서 하나씩 차례대로 다음 element에 접근하면 된다.

그런데 set과 dictionary가 iterable 자료형인 것은 자연스럽게 받아들여지지 않는다. Set과 dictionary는 list와는 달리 순서가 정해져있지 않는 자료형이기 때문에 애초에 다음에 접근할 element를 정할 수 없을 거라고 생각했다. 하물며 '접근할 수 있다고 해도 element에 접근하는 과정에서 한번씩 접근하는게 아니라 중복이 일어나지 않을까?' 라고 생각했다.

Set과 dictionary가 interable 자료형인 이유는 set과 dictionary를 구현하는데 사용하는 hash table이 근본적으로는 dynamic array이기 때문이다. 그렇기 때문에 dynamic array를 하나씩 조회하면 element들을 중복되지 않게 한번씩만 접근할 수 있다. 즉, iterable하다는 것이다. 물론, element들의 순서는 뒤죽박죽일 것이다. 왜냐하면 element들이 hash function를 통해 나온 hash값에 따라 dynamic array에 저장되기 때문이다.

Sized

Sized interface는 Sized interface를 구현하는 객체들이 __len__() 매직 메소드를 구체화하도록 한다. __len__() 매직 메소드는 객체로 하여금 len() 함수의 인자로 전달되었을 때 자료형이 가지고 있는 데이터의 개수를 반환하도록 하는 메소드이다.

Container

Container interface는 Container interface를 구현하는 객체들이 __contains__() 매직 메소드를 구체화하도록 한다. __contains__() 매직 메소드는 객체로 하여금 in, not in 연산자를 통한 연산이 가능하도록 한다.

Collection 하위 class

Sequence

Sequence는 순서가 보장된 Collection 자료형이다.

순서가 보장된다는 것이 무엇을 의미하는지 더 잘 이해하기 위해 Sequence가 아닌 자료형을 알아보자. Set은 파이썬에서 Sequence가 아닌 대표적인 자료형이다. 개발자는 set을 처음 만들 때 그리고 set에 element를 삽입, 삭제할 때 set을 구성하는 hash table의 index 중에서 element가 들어갈 index가 무엇인지 알 수 없다. Element가 들어갈 index는 해당 element가 hash function을 통과해서 나온 hash값에 따라 달라지기 때문이다. 따라서 Set의 element의 순서를 개발자는 의도적으로 조작할 수 없다.

그에 반해 Sequence 자료형인 list 자료형은 list를 만들 때, 새로운 element를 삽입하거나 element를 삭제할 때, element의 순서는 개발자가 의도하는대로 맞춰진다. 순서가 보장되어있다는 것은 element의 순서를 개발자가 의도한 대로 만들 수 있다는 것이다.

Sequence 자료형의 대표적인 예로는 list, tuple, string이 있다

Sequence 자료형은 정수를 이용한 접근, 슬라이싱이 가능하다.

Set

Set은 중복을 허용하지 않는 Collection 자료형이다.

Mapping

Mapping은 key - value 쌍을 저장하는 Collection 자료형이다.

profile
HGU 20 김민석

0개의 댓글