파이썬을 배우다 보면 리스트 외에도 자주 등장하는 자료형 중 하나가 튜플(tuple)이다. 리스트와 비슷하지만 몇 가지 중요한 차이점이 있는 튜플의 개념과 활용 방법을 알아보자.
튜플이란?
튜플은 순서가 있고 변경할 수 없는(immutable) 자료형이다. 한 번 생성하면 그 안의 요소를 수정하거나 삭제할 수 없다는 점에서 리스트와 다르다. 이러한 특성 덕분에 데이터의 무결성을 유지해야 할 때 유용하게 사용된다. 또한 튜플은 해시 가능하므로 딕셔너리의 키로 사용할 수 있고, 일반적으로 튜플이 리스트보다 속도가 빠르다.
튜플과 리스트의 차이점
특징 | 리스트(List) | 튜플(Tuple) |
변경 가능 여부 | 변경 가능(mutable) | 변경 불가능(immutable) |
사용 목적 | 데이터의 변경이 필요한 경우 | 데이터의 변경이 필요 없을 때 |
생성 방법 | 대괄호 [] 사용 | 소괄호 () 사용 |
메서드 지원 | append(), remove() 등 다양한 메서드 제공 | 제한된 메서드만 제공 |
튜플 생성하기
튜플을 생성하려면 소괄호 () 안에 요소들을 넣으면 된다. 튜플도 리스트와 마찬가지로 여러 가지 자료형의 값을 섞어서 생성할 수도 있다.
numbers = (1, 2, 3, 4, 5)
print(numbers) # (1, 2, 3, 4, 5)
colors = ('red', 'green' ,'blue')
print(colors) # ('red', 'green' ,'blue')
mixed = (1, 2, 'red')
print(mixed) # (1, 2, 'red')
공백 튜플은 단순히 소괄호만 적어주면 된다.
tuple = ()
요소가 하나인 튜플을 생성할 때는 요소 뒤에 쉼표를 반드시 붙여야 한다. 쉼표가 없으면 단순한 수식으로 처리된다.
t = (42,)
print(t) # (42,)
# 쉼표가 없으면 튜플이 아닌 단순한 수식으로 처리된다
# (42)는 정수 42로 처리된다.
q = (42)
print(q) # 42
튜플은 소괄호 ()를 사용하여 감싸는 것이 원칙이지만, 괄호 없이 나열된 객체들도 기본적으로 튜플로 간주된다.
# 소괄호 없이 튜플 생성
colors = '빨강', '초록', '파랑'
print(colors) # ('빨강', '초록', '파랑')
튜플의 특징
tuple()을 이용하면 리스트로부터 튜플을 생성할 수도 있다.
t = tuple([1, 2, 3, 4, 5])
또 리스트와 마찬가지로 튜플도 내부에 다른 튜플을 가질 수 있다.
t = (1, 2, 'hi')
u = t, (3, 4, 5)
print(u) # ((1, 2, 'hi'), (3, 4, 5)
튜플은 시퀀스의 일종이므로 모든 시퀀스 연산이 적용되며, len(), min(), max()와 같은 함수들을 사용할 수 있다.
numbers = (1, 2, 3, 4, 5)
len(numbers) # 5
주의할 점! 앞서 언급했다시피 튜플은 변경될 수 없는 객체이다. 그렇기 때문에 튜플의 요소는 변경될 수 없다.
t = (1, 2, 3, 4, 5)
t[0] = 100 # ❌ 튜플의 요소를 변경하려고 하면 오류가 발생한다.
다만 2개의 튜플을 합해서 새로운 튜플을 만드는 것은 가능하다. 새로운 튜플을 만드는 것은 허용되지만 한번 만들어진 튜플은 수정할 수 없는 것이다.
nubmers = (1, 2, 3, 4, 5)
colors = ('red', 'green', 'blue')
t = numbers + colors
print(t) # (1, 2, 3, 4, 5, 'red', 'green', 'blue')
기본적인 튜플 연산들
튜플은 시퀀스의 일종이기 때문에 시퀀스가 제공하는 모든 일반 연산을 사용할 수 있다. 인덱싱과 슬라이싱도 문자열이나 리스트와 동일하게 동작한다.
len((1, 2, 3)) # 3
(1, 2, 3) + (4, 5, 6) # (1, 2, 3, 4, 5, 6)
(1, 2, 3) * 3 # (1, 2, 3, 1, 2, 3, 1, 2, 3)
3 in (1, 2, 3) # True
for i in (1, 2, 3):
print(i, end=" ") # 1 2 3
t = ("apple", "banana", "cherry")
t[0] # 'apple'
t[-2] # 'banana'
시퀀스의 기본 연산자와 함수에 대해, 인덱싱과 슬라이싱에 대해 더 자세한 내용을 원한다면 아래 포스트에서 확인할 수 있다.
튜플 대입 연산
파이썬은 튜플 대입 연산(Tuple Assignment)이라는 기능을 가지고 있다. 이 기능은 튜플에서 여러 개의 변수로 한 번에 값을 대입하는 강력한 기능이다. 자바스크립트의 디스트럭처링 할당과 비슷한 개념이다.
point = (15, 25)
(x, y) = point
print(f"x: {x}, y: {y}") # x: 15, y: 25
튜플에 값을 저장하는 과정을 튜플 패킹(Tuple Packing)이라고 하고, 반대로 튜플에서 값을 꺼내어 변수에 대입하는 과정을 튜플 언패킹(Tuple Unpacking)이라고 한다.
이 튜플 대입 연산을 활용해 변수의 값을 아주 쉽게 교환할 수 있다.
(x, y) = (y, x)
위 코드에서 x와 y 값이 변경된 것으로 헷갈릴 수 있으나, 좌변의 x와 y라는 "변수"에 우변의 y와 x라는 "값"을 각각 넣어준 것이다. 다시 한번 말하지만 튜플에서는 값을 변경할 수 없다.
참고로 변수의 개수와 값의 개수는 일치해야 한다. 일치하지 않으면 에러를 발생시킨다.
(x, y, z) = (1, 2) # ❌ 에러 발생!!
튜플과 리스트, 무엇을 선택해야 할까?
지금까지 튜플이라는 자료형에 대해 알아보았다. 튜플은 굉장히 많은 면에서 리스트와 비슷하다. 그렇다면 둘 중 무엇을 선택해야 할까? 아래와 같이 정리해 보았다!
- 데이터의 변경이 필요한 경우 ➡️ 리스트!
- 고정된 데이터를 다루는 경우 ➡️ 튜플!
- 딕셔너리 키로 사용하는 경우 ➡️ 튜플!
- 성능 최적화를 원하는 경우 ➡️ 튜플! (튜플이 리스트보다 좀 더 빠르다)
정리
튜플은 파이썬에서 리스트와 함께 자주 사용되는 중요한 자료형이다. 변경할 필요가 없는 데이터를 안전하게 다루고, 함수에서 여러 값을 효율적으로 반환하며, 딕셔너리의 키로 활용할 수 있는 등 다양한 장점을 제공한다. 튜플과 리스트의 차이점을 잘 이해하고 상황에 맞게 적절히 활용하면 더욱 효율적이고 안정적인 파이썬 코드를 작성할 수 있을 것이다.
'Language > Python' 카테고리의 다른 글
[Python] 파이썬 딕셔너리(dictionary) 이해하기 (0) | 2025.01.18 |
---|---|
[Python] 파이썬 세트(set) 자료구조 이해하기 (0) | 2025.01.18 |
[Python] 파이썬 2차원 리스트 (생성, 접근, 활용) (0) | 2025.01.17 |
[Python] 파이썬 리스트 컴프리헨션 (리스트 함축, List Comprehension) (0) | 2025.01.16 |
[Python] 파이썬 리스트와 함수 (값으로 호출 vs 참조로 호출) (0) | 2025.01.16 |