flowchart TD
ROOT["파이썬의 핵심 복합 자료구조"] --> L["1. 리스트 (List)<br/>순서 O, 수정 가능 (가변)<br/>[10, 20, 30]"]
ROOT --> T["2. 튜플 (Tuple)<br/>순서 O, 수정 불가 (불변)<br/>(10, 20, 30)"]
ROOT --> D["3. 딕셔너리 (Dict)<br/>키-값 매핑, 빠른 검색<br/>{'사과': 1500}"]
style ROOT fill:#f1f5f9,stroke:#475569
style L fill:#dbeafe,stroke:#2563eb,stroke-width:2px
style T fill:#fef3c7,stroke:#d97706
style D fill:#dcfce7,stroke:#16a34a,stroke-width:2px
개념 이해
왜 자료구조인가: 데이터 컬렉션의 필연성
학생 \(100\)명의 성적을 처리하기 위해 score1, score2, …, score100처럼 100개의 개별 변수를 선언하는 것은 비효율적이며 프로그램의 확장성을 파괴합니다.
자료구조(Data Structure)는 여러 개의 연관된 데이터를 하나의 묶음으로 구조화하여 컴퓨터 메모리에 효율적으로 저장하고 관리하는 체계적인 방식입니다.
순서형 가변 컬렉션: 리스트 (List)
리스트는 대괄호([])를 사용하여 여러 원소를 쉼표로 구분해 나열하며, 서로 다른 자료형을 자유롭게 혼합하여 담을 수 있습니다.
0-기반 인덱싱(Indexing)과 양수/음수 인덱스
파이썬은 첫 번째 원소의 위치를 \(0\)부터 시작하는 0-기반 인덱싱(Zero-based Indexing)을 따릅니다. 또한 리스트의 맨 끝에서부터 역방향으로 접근할 수 있는 음수 인덱스를 지원합니다.
fruits = ["사과", "바나나", "포도", "딸기"]flowchart LR
subgraph PosIndex["양수 인덱스 (정방향: 0부터)"]
P0["[0]"] --- P1["[1]"] --- P2["[2]"] --- P3["[3]"]
end
subgraph Elements["리스트 원소 데이터"]
E0["'사과'"] --- E1["'바나나'"] --- E2["'포도'"] --- E3["'딸기'"]
end
subgraph NegIndex["음수 인덱스 (역방향: -1부터)"]
N0["[-4]"] --- N1["[-3]"] --- N2["[-2]"] --- N3["[-1]"]
end
P0 --> E0
P1 --> E1
P2 --> E2
P3 --> E3
N0 --> E0
N1 --> E1
N2 --> E2
N3 --> E3
style PosIndex fill:#eff6ff,stroke:#3b82f6
style Elements fill:#fef3c7,stroke:#d97706,stroke-width:2px
style NegIndex fill:#f0fdf4,stroke:#22c55e
fruits = ["사과", "바나나", "포도", "딸기"]
print(fruits[0]) # 사과 (첫 번째)
print(fruits[-1]) # 딸기 (가장 마지막)리스트 슬라이싱 (Slicing): [start:stop:step]
리스트의 특정 부분 구간을 새로운 부분 리스트로 잘라내는 기법입니다. range()와 마찬가지로 stop 인덱스는 포함되지 않습니다.
numbers = [10, 20, 30, 40, 50, 60, 70]
print(numbers[1:4]) # [20, 30, 40] (1번부터 3번까지)
print(numbers[:3]) # [10, 20, 30] (처음부터 2번까지)
print(numbers[4:]) # [50, 60, 70] (4번부터 끝까지)
print(numbers[::2]) # [10, 30, 50, 70] (2칸씩 건너뛰기)
print(numbers[::-1]) # [70, 60, 50, 40, 30, 20, 10] (리스트 역순 뒤집기)리스트 주요 내장 조작 메서드
| 메서드 형태 | 동작 설명 | 코드 예시 |
|---|---|---|
list.append(x) |
리스트의 맨 끝에 원소 \(x\)를 추가 | scores.append(85) |
list.insert(i, x) |
\(i\)번 인덱스 위치에 원소 \(x\)를 삽입 | scores.insert(0, 100) |
list.pop(i) |
\(i\)번 인덱스 원소를 꺼내서 반환하고 삭제 (기본값: 마지막) | last = scores.pop() |
list.remove(x) |
리스트에서 첫 번째로 등장하는 값 \(x\)를 찾아 삭제 | scores.remove(60) |
list.sort() |
리스트 원소들을 오름차순으로 제자리 정렬 | scores.sort() |
len(list) |
리스트에 저장된 총 원소 개수 반환 | count = len(scores) |
불변 시퀀스: 튜플 (Tuple)
튜플은 소괄호(())를 사용하며, 한 번 생성되면 원소를 추가·삭제·수정할 수 없는 불변(Immutable) 특성을 가집니다.
- 장점: 의도치 않은 데이터 변조를 원천 방지하여 데이터 무결성(Integrity)을 보장하며, 리스트보다 메모리를 적게 차지하고 속도가 빠릅니다.
- 주요 용도: 좌표값(
(x, y)), RGB 색상 코드((255, 128, 0)), 함수의 다중 반환값 등.
# 튜플 정의와 언패킹(Unpacking)
coordinates = (37.5665, 126.9780) # 서울 시청 위도/경도
lat, lon = coordinates # 다중 변수에 한 번에 분해 할당
print(f"위도: {lat}, 경도: {lon}")키-값 매핑 테이블: 딕셔너리 (Dictionary)
딕셔너리는 중괄호({})를 사용하며, {Key: Value}의 쌍(Pair)으로 데이터를 저장합니다. 리스트처럼 숫자로 된 인덱스 대신 의미 있는 이름인 ‘Key’를 통해 데이터에 즉시 접근합니다.
flowchart LR
K1["Key: 'name'"] --> V1["Value: '신기홍'"]
K2["Key: 'dept'"] --> V2["Value: 'AI소프트웨어'"]
K3["Key: 'gpa'"] --> V3["Value: 4.35"]
style K1 fill:#dbeafe
style K2 fill:#dbeafe
style K3 fill:#dbeafe
style V1 fill:#fef3c7
style V2 fill:#fef3c7
style V3 fill:#fef3c7
# 학생 프로필 딕셔너리
student = {
"name": "신기홍",
"student_id": "20260101",
"major": "컴퓨터공학",
"is_enrolled": True
}
# 데이터 조회 및 수정
print(student["name"]) # 신기홍
student["gpa"] = 4.2 # 새로운 키-값 쌍 추가
student["major"] = "AI데이터" # 기존 값 수정실전 응용 예제 2선
예제 1: 학생 성적 통계 분석기
수십 명의 시험 점수 리스트를 입력받아 총점, 평균, 최고점, 최저점을 한 번에 산출합니다.
exam_scores = [88, 92, 75, 64, 98, 82, 91, 79, 85, 100]
total = sum(exam_scores)
count = len(exam_scores)
avg = total / count
highest = max(exam_scores)
lowest = min(exam_scores)
print("=== 2026학년도 1학기 중간고사 성적 리포트 ===")
print(f"응시 인원: {count}명")
print(f"총점: {total}점, 평균: {avg:.2f}점")
print(f"수석 최고점: {highest}점, 최저점: {lowest}점")예제 2: 카페 키오스크 주문 및 재고 관리 시스템
메뉴판 가격 딕셔너리와 현재 재고 딕셔너리를 연동하여 주문을 처리합니다.
# 메뉴별 단가 테이블 (단위: 원)
price_table = {
"아메리카노": 4500,
"카페라떼": 5000,
"바닐라라떼": 5500,
"자몽에이드": 6000
}
# 고객 주문 목록 (리스트)
customer_orders = ["아메리카노", "바닐라라떼", "아메리카노"]
total_payment = 0
print("--- 영수증 ---")
for item in customer_orders:
if item in price_table:
price = price_table[item]
total_payment += price
print(f"• {item}: {price:,}원")
print("-------------")
print(f"최종 청구 금액: {total_payment:,}원")핵심 개념 확인
- 리스트(List)는 가변(Mutable) 순서형 자료구조로, 슬라이싱과 다양한 조작 메서드(
append,pop,sort)를 통해 동적 데이터를 다룹니다. - 튜플(Tuple)은 불변(Immutable) 순서형 자료구조로, 수정되지 않아야 할 고정 데이터 세트를 안전하게 보호합니다.
- 딕셔너리(Dictionary)는
{Key: Value}해시 맵 구조로, 인덱스 번호가 아닌 의미 있는 단어로 고속 조회를 수행합니다.