본문 바로가기
프로그래밍/python

[python] java 개발자가 배우는 python - tuple

by 사바라다 2020. 6. 14.

안녕하세요. java 개발자가 배우는 python 3번째 시간입니다. 오늘 알아볼 것은 java 개발자가에게는 조금 생소한 개념일 수도 있는 tuple이라는 자료구조입니다.

tuple

tuple으 쉼표로 구분되는 여러 값으로 구성되는 자료구조입니다. 이 tuple은 python의 immutable(수정불가능한) list로써 python 함수의 다중리턴에 사용됩니다. 어떻게 사용하는 자료구조인지 예시를 들어가며 한번 확인해보도록 하겠습니다. 선언은 소괄호와 컴마를 이용해서 가능합니다.

>>> test = ()
>>> type(test)
<class 'tuple'>
>>> t = (1, 2, 3)
>>> t
(1, 2, 3)
>>> type(t)
<class 'tuple'>

뿐만 아니라 선언시 초기화 할 경우에는 소괄호를 생략해도 tuple 자료형으로 선언됩니다.

>>> t = 1, 2, 3
>>> t
(1, 2, 3)
>>> type(t)
<class 'tuple'>

그러나 1개의 값만을 선언할 때 일반적으로 생각하면 (1)이라고 선언할 것 입니다. 하지만 이렇게 선언했을 때는 int 형으로 인식합니다. 1개만 선언할 때는 (1,)로 컴마를 반드시 넣어줘야 tuple로 인식된다는 점 명심하시기 바랍니다.

>>> a = (1)
>>> a
1
>>> type(a)
<class 'int'>
>>> a = (1,)
>>> a
(1,)
>>> type(a)
<class 'tuple'>

Tuple은 Immutable 값입니다. 즉 한번 선언하면 수정, 삭제, 추가가 되지 않습니다. 추가는 + 로 되지않나? 라고 생각학시는 분이 있을 수 있습니다. 하지만 뜯어보면 주소값이 달라지는 것을 알 수 있습니다. 즉, 추가되는 것이 아니라 새로운 tuple이 만들어지는 것입니다.

>>> del t[1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item deletion
>>> t[1] = 4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> id(a)
4366269504
>>> a = a + (2,)
>>> id(a)
4366556736

list와 tuple이 유사하게 느껴집니다. 하지만 차이는 분명합니다. 단순히 생각하면 list는 []로 둘러싸고 tuple은 ()로 둘러쌉니다. 그리고 list는 그 값을 추가와 삭제, 그리고 수정이 가능합니다만 튜플은 불가능합니다.

따라서 프로그램이 실행되는 동안 그 값이 항상 변하지 않기를 바란다거나 값이 바뀔까 걱정하고 싶지 않다면 tuple 자료구조를 사용하면 됩니다.

tuple은 packing과 unpacking이라는 패러다임을 제공합니다. packing은 말 그대로 묶는 다는 의미입니다. 위에서 보았던 t = (1, 2, 3)이 바로 t 변수로 1, 2, 3이라는 값을 packing한 것입니다. unpacking이라는 것은 packing의 반대로 tuple을 각각 할당하는 것입니다.

>>> t = (1, 2, 3) # packing
>>> a, b, c = t   # unpacking
>>> a
1
>>> b
2
>>> c
3

python 시스템 내부적으로 tuple의 unpacking을 사용하는 곳이 있습니다. 바로 python 함수의 멀티 리턴입니다. python의 함수는 java의 메서드와는 다르게 멀티 리턴을 제공하고있습니다. 바로 이 멀티 리턴은 tuple 자료구조를 이용하여 구현되어 있습니다.

>>> def multi_return():
...     return (1,2,3,4,5)
...
>>> a, b, c, d, e = multi_return()
>>> a
1
>>> b
2
>>> c
3
>>> d
4
>>> e
5

마무리

이렇게 오늘 알아본 tuple은 java에서 immutable로 구현된(remove, update, add) List와 유사합니다. java에서는 immutable List를 기본적으로 지원하고 있지 않습니다만, guava의 ImmutableList 등의 라이브러리를 통해서 구현되어있으며 이용할 수 있습니다.

guava의 ImmutableList와 tuple을 비교해보는 것도 좋을것 같습니다.

또한 tuple 이라는 자료구조는 많은 java의 오픈소스에서도 차용하고 있는것으로 알고 있습니다. 제가 최근 사용하고 있는 projectReactor에서도 zip이라는 메서드의 return을 Tuple 자료구조를 직접 구현하여 이용하고 있습니다. 알아두면 좋을것 같습니다.

오늘은 여기까지 python의 tuple에 대해서 알아보았습니다.

감사합니다.

참조

https://wikidocs.net/15

https://docs.python.org/ko/3/tutorial/datastructures.html#tuples-and-sequences

https://dojang.io/mod/page/view.php?id=2340

댓글