1. 튜플 개요

 

1.1 튜플이란?

튜플(tuple)은 여러 개의 값을 하나의 묶음으로 저장하는 자료형이다.
겉으로 보기에는 리스트와 매우 유사하지만, 가장 큰 차이점은 변경 가능 여부이다.
❗튜플은 한 번 생성되면 내부의 값을 절대 변경할 수 없는 자료형(immutable) 이다.❗

my_tuple = (1, 2, 3)

핵심 키워드

• 저장된 값에는 순서(index) 가 존재한다

• 여러 개의 값을 하나의 변수에 저장할 수 있다

• 서로 다른 자료형을 함께 저장할 수 있다

• 생성 이후에는 요소를 추가, 수정, 삭제할 수 없다 → 불변성을 지님

 

1.2 튜플의 불변성 (Immutable)

튜플이 한 번 생성된 이후에는 내부 요소를 변경할 수 없다는 성질을 의미한다.
구체적으로 튜플에서는 다음과 같은 작업이 불가능하다.

• 특정 요소의 값 변경

• 새로운 요소의 추가

• 기존 요소의 삭제

즉, 튜플은 데이터를 안전하게 고정해 두기 위한 용도로 사용되는 자료형이라 할수 있다.

 

이러한 특성 때문에 튜플은 변경되면 안되는 값, 프로그램 전반에서 기준이 되는 데이터를 저장할 때 사용된다.

 

 

 


2. 튜플의 생성과 기본 사용법

2.1 튜플의 생성 방법

#1. ()를 사용
my_tuple = (1, 2, 3)
print(my_tuple)  # 출력: (1, 2, 3)

#2. () 없이 생성 (튜플패킹)
my_tuple = 1, 2, 3
print(my_tuple)        # 출력: (1, 2, 3)
print(type(my_tuple))  # 출력: <class 'tuple'>

#3. tuple()함수를 사용해 생성
my_list = [1, 2, 3]
my_tuple = tuple(my_list) # 리스트를 튜플로 변환
print(my_tuple)  # 출력: (1, 2, 3)

 

 

단일 요소 튜플 생성 시 주의사항

# 단일요소로 추가할때 (쉼표를 넣지 않으면 일반값으로 인식)
single_element = (5,)
print(single_element)        # 출력: (5,)
print(type(single_element))  # 출력: <class 'tuple'>

# 쉼표가 없으면 일반 값으로 인식
not_a_tuple = (5)
print(type(not_a_tuple))  # 출력: <class 'int'>

단일요소로 튜플을 생성할때, 쉼표를 넣지 않으면 일반값으로 인시갛게 된다.

따라서 만약 단일요소로 튜플을 생성하게 되면 반드시 쉼표를 기입해야 한다.

 

2.1 튜플의 인덱싱 (Indexing)

튜플에서 특정 위치의 요소 하나를 선택하는 방법이다.

fruits = ('apple', 'banana', 'cherry', 'date')

# 양의 인덱싱
print(fruits[0])    # 출력: apple

# 음의 인덱싱
print(fruits[-1])   # 출력: date

 

2.2 슬라이싱 (Slicing)

튜플의 원하는 부분만 잘라서 사용하는 방법이다. 

numbers = (0, 1, 2, 3, 4, 5, 6)

print(numbers[2:5])    # 출력: (2, 3, 4)
print(numbers[:3])     # 출력: (0, 1, 2)
print(numbers[4:])     # 출력: (4, 5, 6)
print(numbers[::2])    # 출력: (0, 2, 4, 6)
print(numbers[::-1])   # 출력: (6, 5, 4, 3, 2, 1, 0)

 


3. 튜플의 다양한 메소드

튜플은 불변성을 지니고 있기 때문에 사용 가능한 메소드의 가짓수가 적다.

 

3.1 count()

특정 요소의 개수를 반환. 특정 값이 몇 번 등장했는지

numbers = (1, 2, 2, 3, 3, 3)
print(numbers.count(2))  # 출력: 2
print(numbers.count(3))  # 출력: 3

 

3.2 index()

첫 번째로 일치하는 요소의 인덱스를 반환. 특정 값이 처음 등장한 위치 확인

fruits = ('apple', 'banana', 'cherry')
print(fruits.index('banana'))  # 출력: 1

4. 튜플의 반복과 구조적 활용

 

4.1 튜플과 반복문

튜플의 각 요소에 접근하거나 처리하기 위해 반복문을 사용할 수 있다.

fruits = ('apple', 'banana', 'cherry')

for fruit in fruits:
    print(fruit)
    
    
# 인덱스 활용
for index, value in enumerate(fruits):
    print(f'인덱스 {index}: {value}')

 

4.2 중첩 튜플

튜플 안에 튜플을 요소로 가질 수 있다.

nested_tuple = (1, (2, 3), (4, (5, 6)))
print(nested_tuple[1])       # 출력: (2, 3)
print(nested_tuple[2][1])    # 출력: (5, 6)
print(nested_tuple[2][1][0]) # 출력: 5

 


5. 튜플의 비교와 정렬

 

5.1 튜플의 비교 방식

튜플은 같은 길이의 시퀀스 자료형이기 때문에, 요소를 왼쪽부터 하나씩 순서대로 비교할 수 있다.

# 튜플끼리의 비교
tuple1 = (1, 2, 3)
tuple2 = (1, 2, 4)

print(tuple1 < tuple2)  # 출력: True

비교가 이루어지는 과정

첫 번째 요소 비교 → 1 == 1 → 다음 요소로 이동
두 번째 요소 비교 → 2 == 2 → 다음 요소로 이동

세 번째 요소 비교 → 3 < 4 → True 반환

즉, 처음으로 값이 달라지는 위치의 요소가 비교 결과를 결정한다.

 

5.2 튜플의 정렬

튜플 자체는 불변(immutable)이기 때문에, 튜플 내부 요소를 직접 변경할 수는 없다.
하지만 튜플을 요소로 가지는 리스트는 정렬이 가능하다.

students = [('John', 'A', 15), ('Jane', 'B', 12), ('Dave', 'A', 10)]

# 나이를 기준으로 정렬
students_sorted = sorted(students, key=lambda student: student[2])
print(students_sorted)
# 출력: [('Dave', 'A', 10), ('Jane', 'B', 12), ('John', 'A', 15)]

6. 튜플의 활용 이유와 특징

 

6.1 딕셔너리의 키로 사용

my_dict = { (1, 2): "Point A", (3, 4): "Point B" }
print(my_dict[(1, 2)])  # 출력: Point A

튜플은 변경 불가능한 자료형이기 떄문에 딕셔너리의 키로 활용 가능하다 (해당 내용은 step3. 딕셔너리에서 다룸)

튜플은 생성 이후 값이 바뀌지 않으므로, 딕셔너리에서 안전한 식별자 역할을 할 수 있다.

 

6.2 함수의 복수 반환값

def get_position():
    x = 10
    y = 20
    return x, y  # 튜플로 반환

pos = get_position()
print(pos)        # 출력: (10, 20)
print(type(pos))  # 출력: <class 'tuple'>

파이썬에서 함수는 항상 하나의 객체만 반환한다.
하지만 여러 값을 반환하는 것처럼 보이는 이유는, 반환 값들이 자동으로 튜플로 묶여서 반환되기 때문이다.

return x, y 는 내부적으론 return (x, y)의 형태로 작동한다.

 

6.3 패킹(Packing)과 언패킹(Unpacking)

 

6.3-1 패킹

여러개의 값을 하나의 튜플로 묶는것을 의미한다,

괄호를 생략해도 쉼표(,)가 있으면 파이썬은 이를 자동으로 튜플로 인식한다.

packed_tuple = 1, 2, 3
print(packed_tuple)  # 출력: (1, 2, 3)

 

6.3-2 언패킹

튜플의 요소를 여러 개의 변수에 할당하는 것을 의미한다.

이 방식은 함수의 복수 반환값 처리, 값 교환, 반복문에서 구조 분해 등에서 매우 자주 사용된다.

a, b, c = packed_tuple
print(a)  # 출력: 1
print(b)  # 출력: 2
print(c)  # 출력: 3

규칙

변수의 개수와 튜플의 요소 개수는 반드시 같아야 한다

순서대로 값이 할당된다

 

 

 


7. 튜플 실전 예제

7.1 두 변수의 값 교환

a = 10
b = 20

a, b = b, a  # 값 교환

print(a)  # 출력: 20
print(b)  # 출력: 10

7.2 리스트 ↔ 튜플 변환

my_tuple = (1, 2, 3)
my_list = list(my_tuple)
print(my_list)  # 출력: [1, 2, 3]

my_new_tuple = tuple(my_list)
print(my_new_tuple)  # 출력: (1, 2, 3)

7.3 여러 변수에 동일한 값 할당

x = y = z = 0
print(x, y, z)  # 출력: 0 0 0

 


8. 튜플을 사용하는 판단 기준

튜플은 리스트와 매우 유사해 보이지만, “값이 바뀌면 안 되는가?”라는 기준에서 명확한 역할 차이를 가진다.

따라서 튜플을 언제 사용하는지에 대한 판단 기준을 명확히 이해하는 것이 중요하다.

 

8.1 리스트 대신 튜플을 쓰는 기준

다음과 같은 경우에는 리스트보다 튜플이 더 적합하다.

  • 변경되면 안 되는 데이터
    한 번 정해진 값이 이후로도 바뀌면 안되는 경우
    (좌표, 설정값, 기준값 등)

  • 고정된 구조의 데이터
    항상 같은 의미와 순거를 가져야 하는 값들의 묶음
    ((이름, 점수 등급), (주소지) 등)

이러한 경우 튜플을 사용하면 의도치 않은 값의 변경을 예방할수 있고 코드의 의미가 더욱 명확해진다.


9. 오늘 학습한 내용 정리

  • 튜플의 개념과 불변(immutable) 자료형으로서의 특징
  • 튜플의 생성 방식과 패킹, 언패킹의 동작 원리
  • 인덱싱과 슬라이싱을 통한 요소 접근 방식
  • 튜플이 딕셔너리의 키로 사용될 수 있는 이유
  • 함수의 복수 반환값이 튜플로 처리되는 구조
  • 튜플의 비교 및 정렬 방식과 활용 사례
  • 리스트와 튜플의 차이점 및 선택 기준

 

 

 

+ Recent posts