
파이썬을 다루다 보면 리스트(List)와 비슷하게 생겼지만 대괄호 [] 대신 소괄호 ()를 사용하는 자료구조를 자주 만나게 됩니다.
바로 튜플(Tuple)입니다.
리스트가 자유롭게 데이터를 넣고 뺄 수 있는 '다목적 상자'라면, 튜플은 한 번 포장하면 뜯을 수 없는 '진공 포장'과 같습니다.
오늘은 이 튜플의 특징과 실무에서 어떻게 활용되는지 자세히 알아보겠습니다.
1. 튜플(Tuple)의 핵심 특징
튜플의 가장 큰 목적은 '여러 개의 값을 단순하게 하나로 묶는 것'입니다.
- 읽기 전용 (Immutable): 한 번 생성된 튜플은 내부 데이터를 수정, 삭제, 추가할 수 없습니다. 데이터의 오염을 막고 안전하게 보관해야 할 때 유용합니다.
- 순서 존재: 리스트처럼 데이터가 들어간 순서가 유지되며 인덱싱이 가능합니다.
- 시스템 및 라이브러리 내부 처리용: 개발자가 직접 튜플을 만들기보다는, 파이썬 내부나 외부 라이브러리에서 데이터를 주고받을 때 자동으로 튜플을 사용하는 경우가 훨씬 많습니다. (예: 함수의 다중 값 반환, 가변 인자 처리 등)
💡 추가 지식: 리스트 대신 튜플을 쓰면 좋은 점 수정이 불가능하다는 제약 덕분에 리스트보다 메모리 용량을 적게 차지하고 속도가 더 빠릅니다. 또한, 값이 변하지 않기 때문에 딕셔너리(Dictionary)의 키(Key) 값으로도 사용할 수 있습니다.
2. 튜플 생성과 주의할 점 (단일 멤버 튜플)
튜플은 소괄호 ()를 사용하거나, 괄호 없이 콤마(,)로 값을 나열하여 생성합니다. 하지만 데이터가 1개일 때는 아주 중요한 규칙이 있습니다.
멤버가 1개인 튜플 만들기
값 뒤에 반드시 콤마(,)를 1개 추가해야 합니다. 콤마가 없으면 파이썬은 이를 튜플이 아니라 단순한
'수학적 괄호 연산자'로 인식합니다.
# 1. 콤마가 없는 경우 -> 단순 정수값으로 인식
single_val = (1)
print(type(single_val))
# 출력: <class 'int'>
# 2. 콤마가 있는 경우 -> 튜플로 인식
single_tuple = (1,)
print(type(single_tuple))
# 출력: <class 'tuple'>
빈 튜플과 기본 생성
# 빈 튜플 생성 (수정/추가가 불가능하므로 실질적인 의미는 적습니다)
tus = tuple()
print(tus, len(tus), type(tus))
# 출력: () 0 <class 'tuple'>
# 리터럴을 이용한 생성 (마지막에 콤마를 찍어도 정상적으로 생성됩니다)
tus = (1, 2, 3,)
print(tus, len(tus), type(tus))
# 출력: (1, 2, 3) 3 <class 'tuple'>
*참고: 파이썬에는 리스트 컴프리헨션([x for x in range(3)])은 존재하지만, 소괄호를 사용한 (x for x in range(3))은 튜플 컴프리헨션이 아니라 제너레이터 표현식(Generator Expression)*이라는 별도의 문법입니다. 튜플을 동적으로 만들려면 tuple(x for x in ...) 형태로 감싸주어야 합니다.
3. 데이터 추출 (인덱싱 & 슬라이싱)
튜플도 리스트와 완벽하게 동일한 인덱싱 및 슬라이싱 문법을 지원합니다.
단, 값을 읽어오는 것만 가능하고 수정(tus[0] = 10)은 불가능합니다.
tus = (1, 2, 3, 4, 5)
# 인덱싱 (0번째 값 추출)
print(tus[0])
# 출력: 1
# 슬라이싱 (0번째부터 1번째 값까지 자르기)
print(tus[:2])
# 출력: (1, 2)
4. 실무에서 튜플이 빛을 발하는 순간 (용도)
앞서 튜플은 직접 만들기보다 파이썬 내부 기능으로 활용되는 경우가 많다고 언급했습니다.
대표적인 활용처인 언패킹(Unpacking, 분해)에 대해 알아보겠습니다.
튜플 분해 (Unpacking)
하나의 튜플에 묶인 데이터를 여러 개의 변수에 한 번에 나누어 담을 수 있습니다.
이때 튜플의 멤버 수와 변수의 개수가 정확히 일치해야 합니다.
tus = (10, 20, 30)
# 1. 정상적인 분해
a, age, b = tus
print(age)
# 출력: 20
# 2. 변수 개수가 부족할 때 발생하는 에러
# a, age = tus
# ValueError: too many values to unpack (expected 2) 발생!
불필요한 값 버리기 (언더스코어 _ 활용)
분해 과정에서 특정 위치의 값만 필요하고 나머지는 쓰지 않을 때, 변수명 대신 언더스코어(_)를 사용하여 자리를 채우고 값을 무시할 수 있습니다.
# 첫 번째와 마지막 값만 필요할 때
a, _, b = tus
print(a, b)
# 출력: 10 30
# 마지막 값만 필요할 때
_, _, b = tus
print(b)
# 출력: 30
💡 추가 지식: * 기호를 활용한 가변 분해 파이썬 3 문법부터는 * 기호를 사용해 남은 값들을 통째로 리스트로 묶어 언패킹할 수 있습니다. 멤버 수가 많을 때 매우 유용합니다.
first, *rest = (1, 2, 3, 4, 5)
print(first) # 출력: 1
print(rest) # 출력: [2, 3, 4, 5]
함수에서 여러 개의 값을 반환할 때
파이썬의 함수는 원칙적으로 단 하나의 객체만 반환(return)할 수 있습니다.
하지만 콤마를 사용하여 여러 값을 반환하도록 작성하면, 파이썬이 이를 자동으로 튜플로 묶어서 반환해 줍니다.
def calc(x, y):
"""두 수를 입력받아 사칙연산 수행 결과를 반환"""
# 4개의 값이 쉼표로 연결되어 자동으로 하나의 튜플로 패킹(Packing)됩니다.
return x+y, x-y, x*y, x/y
# 함수가 반환한 튜플을 4개의 변수로 곧바로 언패킹(Unpacking) 합니다.
add, sub, mul, div = calc(10, 2)
print(add, sub, mul, div)
# 출력: 12 8 20 5.0
오늘의 한 마디
확실히 무언가를 할 때 잘 안풀리면 단기간의 상황을 뚫어져라 쳐다보기보다는 좀 멀리서 넓은 시야로 보는 것이 좋은 것 같아요. 투자에서도 자꾸 주가를 확인하거나 단기간의 너무 많은 뉴스를 확인하게 되면 이걸 사야 하나 팔아야 하나에 대한 생각을 하루에도 수십 번씩 하는 것 같습니다. 따라서 우리는 무언가를 할 때 자신만의 기준을 만들면서 나아간다면 그냥 매번 변하는 기준을 가진 사람보다는 더 성장하지 않을까라는 생각을 합니다. (물론 쓸데없는 경험은 없지만요... ㅎㅎ)
'코딩 개발 > Python' 카테고리의 다른 글
| Python - 반복문 (for) (0) | 2026.07.13 |
|---|---|
| Python - 흐름제어, 조건식 (0) | 2026.07.12 |
| Python - 딕셔너리 Dictionary (데이터 추가 및 수정, 인덱싱, get(), keys(), values(), items(), del, clear()) (0) | 2026.07.10 |
| Python - 문자열 포매팅 (%, format, f-string) (0) | 2026.07.08 |
| Python - 문자열 처리 함수 (split(), join(), lower(), upper(), strip() 형제들, find(), index(), in, startwith, endswith, replace()) (0) | 2026.07.07 |