5. 튜플 (Tuple)
파이썬의 튜플(Tuple)은 리스트와 거의 동일한 기능을 수행하지만, 한 번 만들어지면 그 내부 원소를 어떠한 방법을 쓰더라도 변경할 수 없는(Immutable) 강력한 읽기 전용 컬렉션입니다.
데이터가 함부로 조작되거나 훼손되는 것을 방지하기 위해 사용하며, 함수가 여러 개의 결과값을 동시에 반환할 때나 프로그램 내 환경설정 값들을 묶어둘 때 가장 탁월한 선택이 됩니다.
5.1 튜플의 생성과 단일 원소의 함정
튜플을 만들 때는 보통 소괄호 () 를 사용하지만, 사실 튜플을 결정짓는 핵심 기호는 쉼표 , 입니다. 괄호는 여러 요소를 하나로 묶어 보여주기 위한 시각적 보조 장치에 불과합니다.
# 1. 괄호 없는 튜플 생성 (권장되지는 않지만 문법적으로 정상)
t1 = 1, 2, 3, 4
print(t1) # (1, 2, 3, 4)
# 2. 함수가 여러 결과값을 반환할 때 (자동으로 튜플로 치환됨)
def get_location():
return 37.5, 126.9 # 쉼표로 나열된 반환
lat, lng = get_location() # (37.5, 126.9)
단일 원소 튜플 생성 시 주의점
수학에서 수식을 묶어주는 괄호 연산자와 문법이 완벽히 겹치기 때문에, 파이썬은 값이 단 1개만 들어있는 괄호를 보면 이를 튜플이 아닌 단순한 ‘수식 그룹화’로 착각합니다. 1개의 원소를 가진 튜플을 만들 때는 반드시 뒤에 쉼표를 하나 찍어주어야 합니다.
# 잘못된 방법 (그냥 정수 1로 인식됨)
wrong_tuple = (1)
print(type(wrong_tuple)) # <class 'int'>
# 올바른 방법 (쉼표를 찍어 튜플임을 명시)
correct_tuple = (1,)
print(type(correct_tuple)) # <class 'tuple'>
5.2 튜플의 제한적인 메서드
내부 값을 지우거나 추가, 수정하는 것이 철저히 금지되어 있으므로 튜플이 사용할 수 있는 메서드는 오로지 데이터 조회용으로 딱 2가지만 제공됩니다.
count(찾을값): 튜플 안에 찾고자 하는 값이 총 몇 개 들어있는지 셉니다.index(찾을값): 찾고자 하는 값이 튜플의 몇 번째 칸(인덱스 위치)에 있는지 알려줍니다.
t = (1, 2, 3, 2, 3)
print(t.count(2)) # 숫자 2가 튜플 안에 2개 존재함
print(t.index(2)) # 첫 번째로 발견된 숫자 2의 인덱스는 1번 칸
5.3 튜플 안의 리스트 (불변성 파훼의 함정)
튜플 자체는 “내가 품고 있는 원소들의 레퍼런스(메모리 연결선)를 절대 바꾸지 않겠다”는 약속입니다. 그런데 튜플 안에 리스트와 같은 변경 가능(Mutable) 객체를 품고 있다면 어떻게 될까요?
# 튜플의 3번째 원소로 가변 객체인 '리스트'가 들어왔습니다.
t = (1, 2, [10, 20])
# 튜플의 연결선 자체를 끊으려는 시도는 실패합니다.
# t[2] = [99, 99] -> TypeError 예외
# 하지만 튜플이 품고 있는 리스트 자체의 "내부"를 조작하는 것은 막지 못합니다!
t[2][0] = 99
print(t) # (1, 2, [99, 20])
[!WARNING] 이처럼 얕은 수준의 불변성만 제공하기 때문에, 프로그램에서 데이터가 절대 변하지 않음을 완벽히 보장하려면 튜플 내부에 삽입되는 모든 원소들 역시 숫자나 문자열처럼
Immutable한 자료형들로만 채워야 합니다.