Skip to Content
💻 코리아IT아카데미 신촌 - 프로그래밍 학습 자료

Topic 3: 튜플 - 변경할 수 없는 데이터 모음 🔒

🎯 학습 목표

튜플의 특징과 리스트와의 차이점을 이해하고, 변경할 수 없는 데이터 모음이 필요한 상황에서 튜플을 적절히 활용할 수 있습니다.

🔒 튜플이란?

튜플의 개념

**튜플(Tuple)**은 리스트와 비슷하지만 변경할 수 없는 데이터 모음입니다.

# 리스트 (변경 가능) fruits_list = ["사과", "바나나", "오렌지"] fruits_list[0] = "딸기" # 변경 가능! # 튜플 (변경 불가능) fruits_tuple = ("사과", "바나나", "오렌지") # fruits_tuple[0] = "딸기" # 오류! 변경 불가능

튜플의 특징

  1. 불변성(Immutable): 생성 후 변경 불가
  2. 순서 보장: 요소들의 순서가 유지됨
  3. 인덱싱 가능: 리스트처럼 인덱스로 접근 가능
  4. 중복 허용: 같은 값을 여러 번 저장 가능

🏗️ 튜플 생성

기본 생성 방법

# 소괄호 사용 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'>

🎯 언제 튜플을 사용할까?

튜플을 사용하는 경우

  1. 변경되지 않는 데이터: 좌표, 색상 값 등
  2. 함수의 반환값: 여러 값을 한 번에 반환
  3. 딕셔너리의 키: 불변 객체만 키로 사용 가능
  4. 구조적 데이터: 고정된 형태의 데이터
# 좌표계 상수 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}")

리스트를 사용하는 경우

  1. 변경 가능한 데이터: 할 일 목록, 점수 등
  2. 메서드 활용: 추가, 삭제, 정렬 등이 필요한 경우
  3. 동적 크기: 크기가 변할 수 있는 데이터

💡 퀴즈: 튜플 이해도 체크

Q1. 다음 중 올바른 단일 요소 튜플은?

  1. (5)
  2. (5,)
  3. [5]
  4. tuple(5)

💡 정답 확인

정답: 2번 ((5,))

단일 요소 튜플을 만들 때는 반드시 쉼표가 필요합니다.

Q2. 다음 코드의 결과는?

a = 10 b = 20 a, b = b, a print(a, b)
  1. 10 20
  2. 20 10
  3. 오류 발생
  4. 30 30

💡 정답 확인

정답: 2번 (20 10)

튜플 언패킹을 이용한 변수 교환으로 a와 b의 값이 바뀝니다.

Q3. 튜플의 특징이 아닌 것은?

  1. 불변성(변경 불가)
  2. 순서 보장
  3. 중복 허용
  4. 요소 추가 가능

💡 정답 확인

정답: 4번 (요소 추가 가능)

튜플은 불변 객체이므로 생성 후 요소를 추가하거나 삭제할 수 없습니다.

✅ 튜플 마스터 체크리스트

✅ 튜플 마스터 체크리스트

🎉 튜플 마스터 완성!

변경할 수 없는 데이터 모음인 튜플의 모든 특징과 활용법을 익혔습니다!

🏆 이번 토픽에서 배운 내용

  1. 튜플의 특징: 불변성, 순서 보장, 중복 허용
  2. 튜플 생성: 다양한 생성 방법과 주의사항
  3. 튜플 접근: 인덱싱과 슬라이싱
  4. 튜플 vs 리스트: 차이점과 사용 시기
  5. 튜플 언패킹: 변수 할당과 교환
  6. 실용적 활용: 좌표, 함수 반환값, 구조적 데이터

🚀 이제 할 수 있는 것들

  • 변경되지 않는 데이터를 안전하게 관리
  • 함수에서 여러 값을 효율적으로 반환
  • 구조적 데이터를 명확하게 표현
  • 튜플 언패킹으로 코드를 간결하게 작성

다음 토픽에서는 딕셔너리를 배워서 키-값 쌍으로 데이터를 관리하는 방법을 알아보겠습니다! 🚀

Last updated on