Topic 3: 튜플 - 변경할 수 없는 데이터 모음 🔒
🎯 학습 목표
튜플의 특징과 리스트와의 차이점을 이해하고, 변경할 수 없는 데이터 모음이 필요한 상황에서 튜플을 적절히 활용할 수 있습니다.
🔒 튜플이란?
튜플의 개념
**튜플(Tuple)**은 리스트와 비슷하지만 변경할 수 없는 데이터 모음입니다.
# 리스트 (변경 가능)
fruits_list = ["사과", "바나나", "오렌지"]
fruits_list[0] = "딸기" # 변경 가능!
# 튜플 (변경 불가능)
fruits_tuple = ("사과", "바나나", "오렌지")
# fruits_tuple[0] = "딸기" # 오류! 변경 불가능
튜플의 특징
- 불변성(Immutable): 생성 후 변경 불가
- 순서 보장: 요소들의 순서가 유지됨
- 인덱싱 가능: 리스트처럼 인덱스로 접근 가능
- 중복 허용: 같은 값을 여러 번 저장 가능
🏗️ 튜플 생성
기본 생성 방법
# 소괄호 사용
coordinates = (3, 5)
colors = ("빨강", "파랑", "노랑")
# 소괄호 없이도 생성 가능
point = 10, 20
rgb = 255, 0, 128
# 빈 튜플
empty_tuple = ()
하나의 요소만 있는 튜플
# 주의: 쉼표가 필요!
single_tuple = (5,) # 쉼표 있음 - 튜플
not_tuple = (5) # 쉼표 없음 - 그냥 숫자
print(type(single_tuple)) # <class 'tuple'>
print(type(not_tuple)) # <class 'int'>
tuple() 함수 사용
# 리스트를 튜플로 변환
numbers_list = [1, 2, 3, 4, 5]
numbers_tuple = tuple(numbers_list)
print(numbers_tuple) # (1, 2, 3, 4, 5)
# 문자열을 튜플로 변환
text = "Hello"
char_tuple = tuple(text)
print(char_tuple) # ('H', 'e', 'l', 'l', 'o')
🔍 튜플 접근
인덱싱
fruits = ("사과", "바나나", "오렌지", "포도")
print(fruits[0]) # 사과
print(fruits[-1]) # 포도
print(fruits[1]) # 바나나
슬라이싱
numbers = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
print(numbers[2:5]) # (2, 3, 4)
print(numbers[:3]) # (0, 1, 2)
print(numbers[3:]) # (3, 4, 5, 6, 7, 8, 9)
print(numbers[::2]) # (0, 2, 4, 6, 8)
🔄 튜플 vs 리스트
변경 가능성
# 리스트 - 변경 가능
my_list = [1, 2, 3]
my_list[0] = 10 # 성공!
my_list.append(4) # 성공!
# 튜플 - 변경 불가능
my_tuple = (1, 2, 3)
# my_tuple[0] = 10 # 오류!
# my_tuple.append(4) # 오류!
사용 가능한 메서드
numbers = (1, 2, 3, 2, 4, 2, 5)
# 튜플에서 사용 가능한 메서드 (매우 제한적)
print(numbers.count(2)) # 3 (개수 세기)
print(numbers.index(3)) # 2 (위치 찾기)
# 리스트에만 있는 메서드들
# numbers.append(6) # 오류!
# numbers.remove(2) # 오류!
# numbers.sort() # 오류!
🔍 튜플 메서드 자세히 알아보기
count() 메서드
# 색상 튜플에서 특정 색상 개수 세기
colors = ("빨강", "파랑", "빨강", "노랑", "빨강", "초록")
red_count = colors.count("빨강")
blue_count = colors.count("파랑")
purple_count = colors.count("보라") # 없는 색상
print(f"빨강: {red_count}개") # 빨강: 3개
print(f"파랑: {blue_count}개") # 파랑: 1개
print(f"보라: {purple_count}개") # 보라: 0개
index() 메서드
# 점수 튜플에서 특정 점수 위치 찾기
scores = (85, 92, 78, 96, 88, 92)
# 첫 번째 92점의 위치 찾기
first_92_position = scores.index(92)
print(f"첫 번째 92점의 위치: {first_92_position}") # 1
# 특정 범위에서 찾기
second_92_position = scores.index(92, 2) # 2번째 위치부터 찾기
print(f"두 번째 92점의 위치: {second_92_position}") # 5
# 존재하지 않는 값 찾기 (오류 발생)
try:
scores.index(100)
except ValueError:
print("100점은 없습니다!")
실용적인 활용 예시
# 주사위 결과 분석
dice_results = (3, 1, 4, 1, 5, 6, 2, 1, 3, 4, 1, 6)
print("🎲 주사위 결과 분석:")
for number in range(1, 7):
count = dice_results.count(number)
print(f"{number}: {count}번 나옴")
# 가장 많이 나온 숫자 찾기
max_count = 0
most_frequent = 0
for number in range(1, 7):
count = dice_results.count(number)
if count > max_count:
max_count = count
most_frequent = number
print(f"\n가장 많이 나온 숫자: {most_frequent} ({max_count}번)")
📊 튜플 기본 연산
길이와 포함 여부
colors = ("빨강", "파랑", "노랑")
print(len(colors)) # 3
print("빨강" in colors) # True
print("초록" in colors) # False
튜플 연결
tuple1 = (1, 2, 3)
tuple2 = (4, 5, 6)
combined = tuple1 + tuple2
print(combined) # (1, 2, 3, 4, 5, 6)
튜플 반복
numbers = (1, 2, 3)
repeated = numbers * 3
print(repeated) # (1, 2, 3, 1, 2, 3, 1, 2, 3)
🎯 튜플의 실용적 활용
예시 1: 좌표 표현
# 2D 좌표들
points = [(0, 0), (3, 4), (5, 2), (1, 7)]
# 각 점의 거리 계산
import math
for point in points:
x, y = point # 튜플 언패킹
distance = math.sqrt(x**2 + y**2)
print(f"점 {point}의 원점 거리: {distance:.2f}")
예시 2: 학생 정보 관리
# 학생 정보 (이름, 나이, 점수) - 변경되면 안 되는 정보
student1 = ("김철수", 20, 85)
student2 = ("이영희", 19, 92)
student3 = ("박민수", 21, 78)
# 튜플 언패킹으로 정보 출력
name1, age1, score1 = student1
name2, age2, score2 = student2
name3, age3, score3 = student3
print("📊 학생 정보:")
print(f"{name1}({age1}세): {score1}점")
print(f"{name2}({age2}세): {score2}점")
print(f"{name3}({age3}세): {score3}점")
예시 3: 함수에서 여러 값 반환
def get_circle_info(radius):
"""원의 정보를 계산하여 반환"""
import math
circumference = 2 * math.pi * radius
area = math.pi * radius**2
return circumference, area # 튜플로 반환
# 함수 사용
radius = 5
circ, area = get_circle_info(radius) # 튜플 언패킹
print(f"반지름 {radius}인 원:")
print(f"둘레: {circ:.2f}")
print(f"넓이: {area:.2f}")
📦 튜플 언패킹
기본 언패킹
# 튜플의 요소들을 개별 변수에 할당
person = ("김철수", 25, "개발자")
name, age, job = person
print(f"이름: {name}")
print(f"나이: {age}")
print(f"직업: {job}")
변수 교환
# 튜플 언패킹을 이용한 간단한 변수 교환
a = 10
b = 20
print(f"교환 전: a={a}, b={b}")
a, b = b, a # 튜플 언패킹으로 교환
print(f"교환 후: a={a}, b={b}")
필요한 부분만 언패킹
# 일부 값만 사용하고 나머지는 무시
person = ("김철수", 25, "개발자", "서울")
# 이름과 나이만 필요한 경우
name, age, _, _ = person # _는 사용하지 않는 값
print(f"이름: {name}")
print(f"나이: {age}")
# 또는 처음 두 개만 언패킹
name, age = person[:2]
print(f"이름: {name}, 나이: {age}")
🔄 튜플과 리스트 변환
리스트를 튜플로
fruits_list = ["사과", "바나나", "오렌지"]
fruits_tuple = tuple(fruits_list)
print(fruits_tuple) # ('사과', '바나나', '오렌지')
튜플을 리스트로
colors_tuple = ("빨강", "파랑", "노랑")
colors_list = list(colors_tuple)
print(colors_list) # ['빨강', '파랑', '노랑']
🎨 중첩 튜플
좌표와 색상 표현
# 점의 좌표 (x, y)
point1 = (3, 5)
point2 = (7, 2)
point3 = (1, 8)
# 여러 점들을 묶어서 관리
points = (point1, point2, point3)
print("📍 점들의 좌표:")
print(f"첫 번째 점: {points[0]}")
print(f"두 번째 점: {points[1]}")
print(f"세 번째 점: {points[2]}")
간단한 데이터 그룹
# 학생 정보 (이름, 점수)
student_info = (
("김철수", 85),
("이영희", 92),
("박민수", 78)
)
print("📊 학생 성적:")
for name, score in student_info:
print(f"{name}: {score}점")
🚨 자주 발생하는 오류
오류 1: 튜플 수정 시도
# ❌ 틀린 예
coordinates = (3, 5)
# coordinates[0] = 10 # TypeError: 'tuple' object does not support item assignment
# ✅ 올바른 방법
coordinates = (3, 5)
# 새로운 튜플 생성
new_coordinates = (10, coordinates[1])
print(new_coordinates) # (10, 5)
오류 2: 단일 요소 튜플 생성
# ❌ 틀린 예
single = (5)
print(type(single)) # <class 'int'> - 튜플이 아님!
# ✅ 올바른 예
single = (5,) # 쉼표 필수!
print(type(single)) # <class 'tuple'>
🎯 언제 튜플을 사용할까?
튜플을 사용하는 경우
- 변경되지 않는 데이터: 좌표, 색상 값 등
- 함수의 반환값: 여러 값을 한 번에 반환
- 딕셔너리의 키: 불변 객체만 키로 사용 가능
- 구조적 데이터: 고정된 형태의 데이터
# 좌표계 상수
ORIGIN = (0, 0)
UP = (0, 1)
DOWN = (0, -1)
LEFT = (-1, 0)
RIGHT = (1, 0)
# 색상 값 (RGB)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
print(f"원점: {ORIGIN}")
print(f"위쪽 방향: {UP}")
print(f"빨간색: {RED}")
리스트를 사용하는 경우
- 변경 가능한 데이터: 할 일 목록, 점수 등
- 메서드 활용: 추가, 삭제, 정렬 등이 필요한 경우
- 동적 크기: 크기가 변할 수 있는 데이터
💡 퀴즈: 튜플 이해도 체크
Q1. 다음 중 올바른 단일 요소 튜플은?
- (5)
- (5,)
- [5]
- tuple(5)
💡 정답 확인
정답: 2번 ((5,))
단일 요소 튜플을 만들 때는 반드시 쉼표가 필요합니다.
Q2. 다음 코드의 결과는?
a = 10
b = 20
a, b = b, a
print(a, b)
- 10 20
- 20 10
- 오류 발생
- 30 30
💡 정답 확인
정답: 2번 (20 10)
튜플 언패킹을 이용한 변수 교환으로 a와 b의 값이 바뀝니다.
Q3. 튜플의 특징이 아닌 것은?
- 불변성(변경 불가)
- 순서 보장
- 중복 허용
- 요소 추가 가능
💡 정답 확인
정답: 4번 (요소 추가 가능)
튜플은 불변 객체이므로 생성 후 요소를 추가하거나 삭제할 수 없습니다.
✅ 튜플 마스터 체크리스트
✅ 튜플 마스터 체크리스트
🎉 튜플 마스터 완성!
변경할 수 없는 데이터 모음인 튜플의 모든 특징과 활용법을 익혔습니다!
🏆 이번 토픽에서 배운 내용
- 튜플의 특징: 불변성, 순서 보장, 중복 허용
- 튜플 생성: 다양한 생성 방법과 주의사항
- 튜플 접근: 인덱싱과 슬라이싱
- 튜플 vs 리스트: 차이점과 사용 시기
- 튜플 언패킹: 변수 할당과 교환
- 실용적 활용: 좌표, 함수 반환값, 구조적 데이터
🚀 이제 할 수 있는 것들
- 변경되지 않는 데이터를 안전하게 관리
- 함수에서 여러 값을 효율적으로 반환
- 구조적 데이터를 명확하게 표현
- 튜플 언패킹으로 코드를 간결하게 작성
다음 토픽에서는 딕셔너리를 배워서 키-값 쌍으로 데이터를 관리하는 방법을 알아보겠습니다! 🚀
Last updated on