콘텐츠로 이동

코스 5: Four Data - 데이터 구조 (리스트)

코스 개요

이 코스에서 학생들은 여러 데이터를 효율적으로 관리하는 방법인 리스트를 배웁니다. 게임에서 인벤토리, 적 목록, 점수 기록 등 여러 항목을 다뤄야 할 때 리스트가 필수입니다. 데이터 구조의 개념을 이해하면 더 복잡하고 규모 있는 프로그램을 만들 수 있게 됩니다.

예상 소요 시간: 8~16시간

소요 시간은 학생의 학년, 사전 경험, 학습 속도에 따라 크게 달라집니다. 또한 기본 개념만 익히고 넘어가는 경우와 추가 실습 문제나 창의적 프로젝트를 더 진행하는 경우에 따라서도 차이가 납니다. 위 시간은 평균적인 범위이며, 자녀의 페이스에 맞추어 유연하게 진행하시기 바랍니다.

어떤 능력을 키우게 되나요?

데이터를 저장하고 관리하는 "데이터 구조(Data Structure)" 개념을 배웁니다. 세상의 모든 앱, 웹사이트, AI는 데이터를 효율적으로 저장하고 검색하는 구조 위에 만들어집니다. 쇼핑몰의 상품 목록, 유튜브의 영상 리스트, 카톡의 메시지 기록 - 모두 리스트 구조입니다.

어떤 원리를 배우나요?

  • (순차 데이터) 리스트는 데이터를 순서대로 저장합니다. 인덱스(0, 1, 2...)로 원하는 데이터에 바로 접근하는 것은 데이터베이스 조회의 기본 원리입니다.
  • (동적 데이터) append()로 추가, remove()로 삭제하면서 실시간으로 변화하는 데이터를 다룹니다. 사용자가 장바구니에 상품을 넣고 빼는 것, 게임에서 적이 생성되고 사라지는 것 모두 이 원리입니다.
AI 시대 사고력: 컴퓨팅 (문제해결) | 데이터 기반 | 확률적 사고력

컴퓨팅 사고력 (Computational Thinking)

스킬 설명 활동 예시
📋 데이터 조직화 여러 값을 순서대로 정리 인벤토리 아이템 목록 관리
👆 인덱싱 위치 번호로 특정 값 접근 items[0] → 첫 번째 아이템
↕️ 동적 확장 실행 중 데이터 추가/삭제 적을 처치하면 목록에서 제거
🔄 순회 처리 모든 항목에 같은 작업 적용 모든 적의 위치 업데이트

수학적 연결고리

수학 개념 프로그래밍 적용 학습 효과
순서쌍 scores = [100, 95, 87] 수열의 항 표현
0-인덱싱 list[0] = 첫 번째 0부터 세기 시작 (컴퓨터 관례)
길이와 범위 len(list) = 5 → 인덱스 0~4 n개 → 인덱스 0 ~ n-1
합계/평균 sum(scores) / len(scores) 통계 기초

인덱스 계산

표현 의미 예시 (길이 5)
list[0] 첫 번째 0번째 항목
list[-1] 마지막 4번째 항목
list[len(list)-1] 마지막 (계산) 5-1 = 4번째
list[2:4] 슬라이싱 2번, 3번 항목

리스트 연산

# 리스트와 수학
scores = [90, 85, 92, 78, 88]

총합 = sum(scores)           # 433
개수 = len(scores)           # 5
평균 = sum(scores)/len(scores)  # 86.6
최대 = max(scores)           # 92
최소 = min(scores)           # 78
범위 = max(scores) - min(scores)  # 14

실생활 연결

실생활 리스트 표현 연산
쇼핑 목록 ["우유", "빵", "계란"] 추가/삭제
시험 점수 [85, 90, 78, 92] 평균 계산
게임 순위 ["1위", "2위", "3위"] 인덱스로 접근
💻 코드 예시 & 시각화

예시 1: 인벤토리 시스템

# 빈 인벤토리 시작
inventory = []

# 아이템 획득 (append)
inventory.append("검")
inventory.append("방패")
inventory.append("물약")

print(inventory)  # ['검', '방패', '물약']

# 인덱스로 접근
print(inventory[0])  # '검' (첫 번째)
print(inventory[2])  # '물약' (세 번째)

# 아이템 사용 (remove)
inventory.remove("물약")
print(inventory)  # ['검', '방패']

인벤토리 시각화:

append("검")    append("방패")   append("물약")
     ↓               ↓               ↓
┌─────────┐    ┌─────────┐     ┌─────────┐
│ [0] 검  │    │ [0] 검  │     │ [0] 검  │
└─────────┘    │ [1] 방패│     │ [1] 방패│
               └─────────┘     │ [2] 물약│
                               └─────────┘

remove("물약") 후:
┌─────────┐
│ [0] 검  │
│ [1] 방패│
└─────────┘


예시 2: 적 목록 관리

from ursina import *

app = Ursina()

enemies = []  # 적 리스트

# 적 5마리 생성
for i in range(5):
    enemy = Entity(
        model='cube',
        color=color.red,
        position=(i * 2, 0, 5)
    )
    enemies.append(enemy)  # 리스트에 추가

# 모든 적 이동 (반복문으로 순회)
def update():
    for enemy in enemies:
        enemy.z -= 2 * time.dt  # 모든 적이 앞으로 이동

app.run()

적 리스트 구조:

enemies = [enemy0, enemy1, enemy2, enemy3, enemy4]
             │        │        │        │        │
             ▼        ▼        ▼        ▼        ▼
           ┌──┐     ┌──┐     ┌──┐     ┌──┐     ┌──┐
           │■ │     │■ │     │■ │     │■ │     │■ │
           └──┘     └──┘     └──┘     └──┘     └──┘
          x=0      x=2      x=4      x=6      x=8

for enemy in enemies: 로 모두 한 번에 처리!


예시 3: 점수 시스템

scores = [100, 85, 92, 78, 95]

# 리스트 함수 활용
print(f"총점: {sum(scores)}")           # 450
print(f"평균: {sum(scores)/len(scores)}")  # 90.0
print(f"최고점: {max(scores)}")         # 100
print(f"최저점: {min(scores)}")         # 78
print(f"게임 수: {len(scores)}")        # 5

# 새 점수 추가
scores.append(88)
print(f"새 평균: {sum(scores)/len(scores)}")  # 89.67

막대 그래프로 시각화:

100│ ██
 95│ ██          ██
 92│ ██    ██    ██
 88│ ██    ██    ██          ██
 85│ ██ ██ ██    ██          ██
 78│ ██ ██ ██ ██ ██          ██
   └─────────────────────────────
     1  2  3  4  5           6
                           (추가됨)


예시 4: 슬라이싱

colors = ["빨강", "주황", "노랑", "초록", "파랑", "남색", "보라"]

# 슬라이싱 (부분 추출)
print(colors[0:3])   # ['빨강', '주황', '노랑']
print(colors[2:5])   # ['노랑', '초록', '파랑']
print(colors[-3:])   # ['파랑', '남색', '보라'] (뒤에서 3개)
print(colors[::2])   # ['빨강', '노랑', '파랑', '보라'] (2칸씩)

슬라이싱 시각화:

인덱스:  0     1     2     3     4     5     6
      ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┐
      │빨강 │주황 │노랑 │초록 │파랑 │남색 │보라 │
      └─────┴─────┴─────┴─────┴─────┴─────┴─────┘

colors[0:3]:
      ├─────┬─────┬─────┤
      │빨강 │주황 │노랑 │  ← 0, 1, 2번 (3 미포함)
      └─────┴─────┴─────┘

colors[::2]:
      ├─────┼     ├─────┼     ├─────┼     ├─────┤
      │빨강 │     │노랑 │     │파랑 │     │보라 │
      └─────┘     └─────┘     └─────┘     └─────┘
        0           2           4           6


예시 5: 총알 리스트 관리

from ursina import *

app = Ursina()

player = Entity(model='cube', color=color.blue, y=-4)
bullets = []  # 총알 리스트

def input(key):
    if key == 'space':  # 스페이스바로 발사
        bullet = Entity(
            model='sphere',
            color=color.yellow,
            scale=0.3,
            position=player.position
        )
        bullets.append(bullet)

def update():
    # 모든 총알 이동
    for bullet in bullets[:]:  # 복사본으로 순회
        bullet.y += 10 * time.dt

        # 화면 밖으로 나가면 삭제
        if bullet.y > 10:
            bullets.remove(bullet)
            destroy(bullet)

app.run()

총알 관리 플로우:

flowchart TD
    A[스페이스바 누름] --> B[총알 생성<br/>bullets.append]
    B --> C[총알 이동<br/>y += 속도 × dt]
    C --> D{y > 10?}
    D -->|아니오| C
    D -->|예| E[총알 삭제<br/>remove & destroy]
    E -.-> C

화면 시각화:

     ○ ← bullet.y > 10 → 삭제!
    ┌┴┐
    │■│ ← player
    └─┘


챕터 01: 리스트 (Lists)

A. 리스트란?

항목 내용
무엇을 배우나요? 여러 데이터를 하나의 변수에 저장
핵심 개념 컬렉션, 순서, 인덱스

리스트는 여러 값을 순서대로 저장하는 상자들의 줄입니다. inventory = ["검", "방패", "물약"]처럼 여러 아이템을 하나의 변수에 담습니다. 학생들은 변수가 단일 값만이 아니라 여러 값을 저장할 수 있다는 것을 배웁니다. 리스트의 각 항목은 인덱스(번호)로 접근할 수 있으며, 첫 번째 항목은 0번입니다. 이것은 컴퓨터 과학에서 0부터 세기 시작하는 관례를 따릅니다.


B. 리스트 만들기

항목 내용
무엇을 배우나요? 리스트 생성과 초기화
핵심 개념 리터럴, 빈 리스트, 타입

scores = [100, 95, 87, 92]로 숫자 리스트를, names = ["Alice", "Bob"]로 문자열 리스트를 만듭니다. 빈 리스트 items = []를 만들고 나중에 항목을 추가할 수도 있습니다. 학생들은 리스트가 같은 타입 또는 다른 타입의 데이터를 담을 수 있다는 것을 배웁니다. 게임에서 플레이어 목록, 아이템 인벤토리, 레벨 점수 기록 등 다양한 용도로 활용됩니다. 리스트의 길이는 len(scores)로 확인할 수 있습니다.


C. append() - 항목 추가

항목 내용
무엇을 배우나요? 리스트 끝에 새 항목 추가
핵심 개념 메서드, 동적 확장, 가변성

inventory.append("열쇠")는 리스트 끝에 새 항목을 추가합니다. 학생들은 리스트가 크기가 고정되지 않고 동적으로 변한다는 것을 배웁니다. 게임에서 아이템을 획득하면 inventory.append(new_item)으로 인벤토리에 추가합니다. .append()메서드 - 객체(리스트)가 수행하는 행동입니다. 이 개념은 나중에 객체지향 프로그래밍에서 더 깊이 다룹니다.


D. remove() - 항목 제거

항목 내용
무엇을 배우나요? 리스트에서 특정 항목 삭제
핵심 개념 삭제, 검색, 예외 처리

inventory.remove("물약")해당 값을 가진 첫 번째 항목을 제거합니다. 학생들은 데이터가 추가만이 아니라 삭제도 가능하다는 것을 배웁니다. 게임에서 아이템을 사용하거나 적을 처치하면 리스트에서 제거합니다. 존재하지 않는 항목을 제거하려 하면 오류가 발생한다는 것도 배웁니다. 안전한 코드를 위해 삭제 전에 항목이 있는지 확인하는 습관을 기릅니다.


E. 반복문과 리스트

항목 내용
무엇을 배우나요? 리스트의 모든 항목 처리하기
핵심 개념 순회(iteration), 일괄 처리

for item in inventory:리스트의 모든 항목을 하나씩 처리합니다. 이것은 "인벤토리의 각 아이템에 대해 ~하라"라는 의미입니다. 학생들은 리스트와 반복문이 환상의 짝꿍이라는 것을 배웁니다. 모든 적의 위치를 업데이트하거나, 모든 점수를 합산하거나, 모든 아이템을 화면에 표시할 때 이 패턴을 사용합니다. 이것은 데이터 처리의 가장 기본적이고 강력한 패턴입니다.


리스트가 왜 중요한가요?

실생활 연결

리스트는 프로그래밍에서 가장 많이 사용되는 데이터 구조입니다:

실생활 예시 프로그래밍 예시
쇼핑 목록 장바구니 cart = ["우유", "빵"]
학급 명단 사용자 목록 users = ["Alice", "Bob"]
음악 재생 목록 플레이리스트 playlist = [song1, song2]
할 일 목록 투두 리스트 todos = ["숙제", "청소"]

이 코스를 마치면...

학습 성과

학생들은 다음 능력을 갖추게 됩니다:

  • 여러 데이터를 하나의 리스트로 관리할 수 있음
  • 리스트에 항목을 추가하고 제거할 수 있음
  • 인덱스로 특정 항목에 접근할 수 있음
  • 반복문으로 리스트의 모든 항목을 처리할 수 있음
  • 게임의 인벤토리, 적 목록, 점수 기록 등을 구현할 수 있음
  • 더 복잡한 데이터 구조(딕셔너리, 2D 배열 등)를 배울 준비가 됨