MLOps엔지니어

ABC 부트캠프 AI파일럿 1기 MLOps 2일차_ 데이터 분석을 위한 파이썬 기초

ideas9064 2026. 7. 26. 13:07

테크노트 — 2026.07.24 (금)

주제: 데이터 분석을 위한 파이썬 기초 (Day 1)
커버리지: 데이터 분석 개요 · 파이썬 개발환경 · 기본 문법 · 조건문 · 반복문 · 자료구조


오늘의 학습 요약

부트캠프 첫 파이썬 세션. 데이터 분석의 큰 그림(왜 필요한가 → 어디서 데이터를 구하나 → 어떻게 보여주나)부터 시작해서, 실습 도구인 Google Colab 세팅, 그리고 파이썬 문법(변수·연산·문자열·조건문·반복문·자료구조)까지 하루에 훑었다. 4학년까지 파이썬을 몇 번 접해봤지만 대부분 프로젝트에서 AI가 짜준 코드를 붙여쓰는 수준이었어서, 오늘처럼 문법을 밑바닥부터 손으로 치는 시간이 오히려 필요했다. 특히 자료구조 세 종류(리스트/튜플/딕셔너리)의 사용 목적이 다르다는 게 이번에 명확해졌다.


1. 왜 데이터 분석이 필요한가?

1.1 데이터 분석이란

여러 가지 형태의 데이터에서 유용한 정보를 발굴해 가치(Value)와 통찰력(Insight)을 창출해내는 일련의 과정이다. 강사님이 정의한 방식은 "여러 데이터 → 정보 추출 → 가치 창출"의 3단계의 흐름이다.

1.2 데이터 종류

  • 비정형 데이터: 웹페이지, 블로그, 전자저널, 이메일 등 전자문서로 된 텍스트 자료. 정리되지 않은 형태.
  • 정형 데이터: 대규모 DB에 축적된 상품거래, 서비스 거래, 전자우편 송수신 기록 등. 이미 정리된 형태.

초기 데이터 분석은 정형 위주였지만, 최근에는 SNS/텍스트 같은 비정형을 어떻게 수집·정리해서 가치를 뽑아내느냐가 중요해졌다. 분석의 첫 스텝은 "내가 다루는 데이터가 정형인지 비정형인지" 판단하는 것 — 처리 방법이 완전히 다르기 때문.

1.3 데이터 수집 — 어디서 구할까?

① 공공데이터포털 (data.go.kr)

  • 행정안전부에서 운영하는 공공데이터 통합제공 시스템
  • 국내에서 수집되는 거의 모든 공공데이터를 무료 개방
  • 파일데이터(CSV), 오픈 API, 시각화 세 가지 방식으로 제공
  • 신뢰도가 높음 (국가 소속 데이터)
  • CCTV 좌표까지 공개될 정도로 개방 수준이 높다. 잘못된 데이터셋에 대해 오류 신고도 가능.

② Kaggle (kaggle.com)

  • 전 세계 데이터 과학자들이 데이터를 분석할 수 있도록 대회를 개최하고, 분석 내용을 토론할 수 있는 커뮤니티 플랫폼
  • 데이터셋 + 파이썬/R 개발환경 + 초보 강의를 함께 제공
  • 다른 사람의 분석 코드를 볼 수 있다는 것이 학습용으로 가장 큰 장점
  • 다만 신뢰도는 케이스마다 다름. 공모전 제출용이나 신뢰도가 중요한 프로젝트에는 부적합, 참고용/레퍼런스용으로 활용

③ AI Hub (aihub.or.kr)

  • 한국지능정보사회진흥원이 운영하는 AI 통합 플랫폼
  • 국내에서 예산 들여 수집한 양질의 대용량 학습 데이터를 무료로 개방
  • 이미지·비디오·텍스트·오디오·3D·센서 등 유형별로 정리
  • 분야별로 비전·음성/자연어·교육·국토환경·농축수산·안전·자율주행·헬스케어 등
  • 용량이 커서(TB 단위) 샘플 데이터부터 확인하고 본 파일 받는 흐름 권장

④ Web Crawling

위 세 소스에도 원하는 데이터가 없을 때는 직접 수집. 웹 페이지를 그대로 가져와서 데이터를 추출해내는 행위(crawl: 기어가다).

  • 자주 쓰이는 라이브러리: Selenium, BeautifulSoup, requests
  • ⚠️ 저작권 이슈가 핵심이다. 학습 목적이면 괜찮지만 공모전이나 서비스에 쓰려면 저작권 걸린 데이터는 피해야 함. AI로 크롤링 코드 짜기가 쉬워진 만큼 오히려 저작권 체크가 더 중요하다.
  • 자체 수집이 포함된 프로젝트는 포트폴리오/공모전에서 가치가 높게 평가된다. (공수가 큰 만큼)

URL이란?

크롤링 얘기하면서 짚고 넘어간 개념. Uniform Resource Locator의 약자. 인터넷에 접속할 때, 네트워크 상에서 필요한 정보나 자원이 어디 있는지를 알려주는 문자열 = "사이트의 집주소". 예: https://www.google.com/, https://www.data.go.kr/

1.4 데이터 시각화

데이터 분석 결과를 쉽게 이해할 수 있도록 시각적 수단(그래프, 차트)을 통해 정보를 효과적으로 전달하는 것. 강사님 표현으로는 "장문의 보고서 대신 카드 한 장으로 설명이 되게 만드는 것". 어떤 차트를 쓸지 고민하는 것 자체가 분석가의 역량이다.

12가지 대표 시각화 종류 (수업에서 소개된 표):

카테고리 종류
값 비교 막대 그래프(Bar), 원 그래프(Pie), 방사형 그래프(Rader)
위치/공간 데이터 맵(Data Map)
추세 선 그래프(Line), 면적 그래프(Area)
관계 산점도(Scatter Plot), 버블 차트(Bubble)
텍스트/빈도 워드클라우드(Wordcloud)
강도/밀도 열지도(Heatmap)
일정/흐름 간트 차트(Gantt), 깔때기 도표(Funnel Plot)

정리

데이터 소스 부분은 그동안 프로젝트할 때마다 "데이터 어디서 구하지"부터 막혔던 기억이 있는데, 오늘 정리된 세 사이트만으로도 진입 장벽이 확 낮아질 것 같다. 특히 AI Hub는 처음 알았는데 MLOps 방향으로 갈 거면 학습 데이터 이슈가 계속 붙을 테니 즐겨찾기 필수다. 시각화 종류가 이렇게 많은 것도 몰랐는데, 앞으로 데이터 성격에 맞는 차트를 골라 쓰는 감각을 키워야 할 것 같다.


2. 데이터 분석을 위한 파이썬 기초

2.1 파이썬이란

사람과 컴퓨터 사이의 "통역관" 역할을 하는 프로그래밍 언어. 컴퓨터는 0과 1로만 통신하므로, 사람이 "막대그래프 그려줘"라고 요청하려면 중간에 서로 이해할 수 있는 언어가 필요한데 그게 파이썬. 자바보다 훨씬 오래된 언어지만 최근에야 급부상 — 데이터 분석에 특화된 라이브러리 생태계가 결정적이었다.

2.2 데이터 분석 3대 라이브러리

Pandas

  • panel datas의 약자
  • 파이썬 데이터 분석에서 가장 많이 활용되는 라이브러리
  • 데이터를 쉽고 직관적으로 작업할 수 있음
  • 할 수 있는 것:
    • Python 자료구조와의 호환 (List, Tuple, Dictionary, NumpyArray 등)
    • 큰 데이터를 빠르게 자르고 정렬
    • 데이터 통계 및 시각화
    • 외부 데이터(CSV, txt, 엑셀, SQL, XML 등)를 입력받아 자료구조로 저장 및 출력

콤마로 구분된 CSV 텍스트 파일을 자동으로 DataFrame(엑셀 스프레드시트 같은 표 형태)으로 만들어준다. 예전 같으면 반복문 돌려서 하나씩 파싱해야 할 것을 한 줄로 처리 가능.

Numpy

  • Numerical Python의 약자
  • 파이썬의 고성능 과학 계산용 패키지
  • Matrix와 Vector 같은 Array 연산을 할 때 사용하는 표준 라이브러리
  • 특징:
    • 일반 List에 비해 빠르고, 메모리를 효율적으로 사용
    • 반복문 없이 데이터 배열에 대한 처리를 지원
    • 선형대수 관련 다양한 기능 제공
    • C, C++, 포트란 등의 언어와 통합 가능

머신러닝/딥러닝의 기반이 되는 라이브러리라 뒤에서 계속 쓴다고 하셨음.

Matplotlib

  • 그림이나 도형을 그려주는 파이썬 시각화 라이브러리
  • 특징:
    • 표준 플롯을 쉽게 그릴 수 있고, 복잡한 플롯이나 세부 변경도 자유로움
    • Numpy 및 Pandas(Series, DataFrame)가 제공하는 자료와 잘 연동
  • x/y축 데이터만 넣으면 차트가 나오는 수준으로 편함

2.3 왜 데이터 분석에 CSV를 쓸까?

CSV = Comma Separated Values, 쉼표로 구분된 일반 텍스트 형식.

  • CSV는 구현 및 구문 분석이 간단
  • CSV는 모든 소프트웨어가 읽을 수 있는 형식
  • CSV는 대용량 파일을 읽는 속도가 빠름

엑셀(.xlsx)과 자주 비교되는데, 서식이나 수식이 필요없고 순수 데이터만 다룰 때는 CSV가 압도적으로 유리.

2.4 개발환경 — Google Colab

콜랩(Colab) = 클라우드 기반의 무료 Jupyter Notebook 개발환경.

핵심 특징:

  • 공짜 (12시간까지 GPU 무료 사용)
  • 쉽다 (설치 필요 없음)
  • 클라우드 기반 — 크롬만 있으면 어디서든 접속
  • 학습 및 공유 최고 — 팀원과 코드 공유 가능, 여러 명이 동시에 수정 가능
  • 오류 발생 시 자동 검색 기능 지원
  • Jupyter Notebook과 완전 호환

코딩 글꼴 세팅 (★필수)

브라우저 설정 → 모양 → 글꼴 맞춤 설정 → 표준 글꼴을 Consolas 같은 코딩 전용 글꼴로 변경한다.
안 하면 숫자 0과 알파벳 O, 숫자 1과 알파벳 l/I가 구분이 안 돼서 오타 잡을 때 지옥이 열린다. 코딩 폰트에 취향 있는 개발자들이 있을 정도로 중요한 세팅.

정리

코딩 글꼴은 실제로 세팅하니 숫자/알파벳 구분이 확 살아나서 놀랐다. Pandas/Numpy/Matplotlib은 이름만 알고 있었는데 각자의 역할과 왜 이 3개가 세트로 나오는지 감이 왔다.


3. 파이썬 기초 문법

3.1 변수 (Variable)

"어떠한 값을 넣는 상자"변수 이름 = 넣는 값 형태로 선언.

var = 100
print(var)   # 100

var = "나는 변수다!"
print(var)   # 나는 변수다!

변수명 규칙 (강조되었던 부분)

  • 의미 있게 선언할 것 — 변수명만 봐도 무엇이 들어있는지 추정 가능해야 함. a, b, c 같은 이름은 지양.
  • 숫자로 시작 불가: 2025_income ❌ → income_2025
  • _ 를 제외한 특수기호 사용 불가
  • 변수명 중간에 공백 불가 → 단어 연결은 _로 (예: my_name)
  • 예약어(keyword) 사용 불가: if, for, sum 등 파이썬이 이미 문법적으로 쓰고 있는 단어들
  • 예약어를 제외한 영문과 한글은 선언 가능 (한글 변수 가능하지만 실무에선 영문 권장)

예약어 목록은 아래처럼 확인 가능:

import keyword
print(keyword.kwlist)
# ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class',
#  'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for',
#  'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal',
#  'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

파이썬의 편의성

자바와 달리 자료형을 미리 선언하지 않아도 값 보고 자동 판단한다.

name = '이름'       # 문자열
age = 25              # 정수
point = 35.997        # 실수
print(name)           # 이름

3.2 사칙연산

num1 = 100
num2 = 200
result = num1 + num2
print(result)   # 300

+ - * / 는 익숙한 대로. %나머지 연산자(퍼센트 아님). 문자열 포맷팅 지시자로도 쓰여서 처음엔 헷갈릴 수 있음.

3.3 문자열 다루기 — 파이썬을 파이썬답게 만드는 부분

문자열 슬라이싱

word = '안녕하세요 반갑습니다.'
print(word)          # 안녕하세요 반갑습니다.
print(word[0:2])     # 안녕      ← 끝 인덱스는 +1 필요
print(word[6:12])    # 반갑습니다
print(word[6:])      # 반갑습니다.    ← 끝 생략하면 문자열 끝까지
print(word[-1])      # .              ← 뒤에서 첫 번째

다른 언어는 문자열에서 특정 위치를 뽑으려면 반복문을 돌려야 하는데, 파이썬은 인덱싱 하나로 끝난다. 슬라이싱 결과에 +1을 해줘야 하는 규칙은 [시작, 끝) 구간 표기로 이해하면 일관성이 있다.

문자열 연결 연산자 +

str1 = '안녕'
str2 = '하세요'
str_result = str1 + str2
print(str_result)     # 안녕하세요

주의: str_result + age 처럼 문자열 + 정수형은 오류 발생. 형변환 필수.

형변환 함수

  • str(x): 문자열로
  • int(x): 정수로
  • float(x): 실수로
print(str_result + str(age))   # 안녕하세요26

문자열 반복 연산자 *

print(str1 * 20)
# 안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕

콘솔에 구분선 그을 때 유용 (print('=' * 30) 같은 패턴).

문자열 길이 len()

len(word)                       # 12
print(word[6:len(word)])        # 반갑습니다.

len()은 셀 때 1부터, 인덱스는 0부터라는 차이만 기억.

문자열 포맷팅

+ 연결과 str() 형변환 반복을 대체하는 방식.

코드 의미
%s string (문자열)
%d digit (정수)
%f floating point (실수, 전체 자릿수)
%.1f 실수 소수점 첫째 자리까지 (둘째 자리에서 반올림)
%.3f 실수 소수점 셋째 자리까지
x = '저의 나이는 %d살 입니다.' % age
print(x)     # 저의 나이는 26살 입니다.

kor = 88
eng = 95
math = 100
total = kor + eng + math
avg = total / 3
print('%s님 총점은 %d, 평균 점수는 %.3f입니다.' % (name, total, avg))
# ooo님 총점은 283, 평균 점수는 94.333입니다.

포맷팅 실습 — 강아지 정보:

dog_name = '츄츄'
dog_age = 8
dog_type = '포메리안'
print('%s님, %d세, %s입니다.' % (dog_name, dog_age, dog_type))
# 츄츄님, 8세, 포메리안입니다.

머신러닝/딥러닝 결과 출력할 때 포맷팅을 계속 쓴다고 강조하였다. 자릿수만 조정하고 싶을 때 코드 통째로 다시 짜지 않고 %.3f의 숫자만 바꾸면 되니 편하며, AI한테 "다섯 자리로 출력해줘" 하고 코드 다시 받는 것보다 훨씬 빠르다.

3.4 사용자 입력 input()

dog_name = input('이름을 입력하시오:')
print('%s님 반갑습니다.' % (dog_name))
dog_age = int(input('나이를 입력하시오:'))
dog_type = input('견종을 입력하시오:')
print('%s님, %d세, %s입니다.' % (dog_name, dog_age, dog_type))

⚠️ 핵심 함정: input()의 리턴값은 무조건 문자열이다.

num1 = input('첫번째 정수를 입력하세요: ')   # '100' 입력
num2 = input('두번째 정수를 입력하세요: ')   # '200' 입력
print(num1 + num2)                          # 100200  ← 문자열 연결!

숫자로 쓰려면 반드시 int()로 감싸야 함:

num1 = int(input('첫번째 정수를 입력하세요: '))
num2 = int(input('두번째 정수를 입력하세요: '))
print(num1 + num2)   # 300

3.5 주석문

# 한 줄 주석

'''
여러 줄 주석
장문의 설정이나 프로그램 설명용
'''

한 줄 주석은 #, 여러 줄 주석은 작은따옴표 3개(''')로 감싼다. AI에게 코드 짜달라고 할 때 "주석 붙여서" 요청하면 훨씬 검토하기 좋음.

정리

슬라이싱은 처음엔 뒷자리 +1 규칙이 어색했는데, [시작, 끝) 구간 개념으로 이해하니 오히려 일관성 있어 보인다. 음수 인덱스로 뒤에서 세는 게 나중에 데이터 마지막 N개 뽑을 때 정말 편할 것 같다. input()이 무조건 문자열 반환하는 부분은 실제로 100 + 200 = 100200 결과가 뜨는 걸 보고 감이 확 왔다.


4. 조건문

4.1 기본 구조

if 조건1:
    코드A    ← 조건1이 참이면 실행
elif 조건2:
    코드B    ← 조건1 거짓, 조건2 참이면 실행
else:
    코드C    ← 조건1, 조건2 모두 거짓이면 실행
코드D        ← 위 흐름 이후 항상 실행

파이썬은 중괄호가 아니라 들여쓰기(indentation)로 블록을 구분한다. 잘못 들여쓰면 논리 전체가 뒤집힌다.

  • else는 필수가 아님. 조건 만족했을 때만 처리할 거면 if 하나로 끝.
  • 조건이 여러 개면 elif로 이어붙임.

4.2 비교 연산자

연산자 의미
a == b a와 b가 같다
a != b 같지 않다
a > b a가 크다
a >= b a가 크거나 같다
a < b a가 작다
a <= b a가 작거나 같다

규칙: 비교하고자 하는 주체를 앞에 쓴다. 대전시 > 서울시 형태로 방향을 명확히.

=은 값을 담는 대입, ==은 같은지 비교. 이거 헷갈리면 조건문이 통째로 무너진다.

4.3 논리 연산자

연산자 의미
조건1 and 조건2 논리곱 — 둘 다 참이어야 참
조건1 or 조건2 논리합 — 하나만 참이어도 참
not 조건 부정 — 참/거짓을 뒤집음

강사님이 소개팅 조건으로 설명한 게 직관적이었음: "키 크고 and 잘생겨야 함" vs "키 크거나 or 잘생기거나 상관없음".

4.4 실습 ① 양수/음수/영 판별

x = int(input('정수를 입력하세요: '))

if x > 0:
    print('입력된 수는 양수입니다.')
elif x == 0:
    print('입력된 수는 0입니다.')
else:
    print('입력된 수는 음수입니다.')

4.5 실습 ② 용돈 조건 (and / or 조합)

math = 90
kor = 70
money = 50000

if math >= 80 and kor >= 90:
    print('용돈을 %d원으로 올려줄게! 수고했어' % (money * 1.1))
elif math >= 90 or kor >= 90:
    print('용돈을 %d원으로 올려줄게! 수고했어' % (money * 1.05))
else:
    print('다음에 열심히 해라')

4.6 실습 ③ 매표소 키오스크

강의 미션이었고, 여기에 음수 입력 방어까지 추가로 붙였다.

age = int(input('나이가 어떻게 되시나요: '))
price = 2000

if age >= 65:
    print('당신의 나이는 %d입니다. 입장권은 무료입니다.' % (age))
elif 0 < age < 65:
    print('당신의 나이는 %d입니다. 입장권은 %d원입니다.' % (age, price))
else:
    print('나이를 다시 입력하세요')

강의 요구는 65세 이상 무료 / 그 외 2000원 두 가지 분기였지만, 0 < age < 65 조건을 명시적으로 넣어서 음수나 0 입력에 대한 방어를 추가했다. 파이썬은 0 < age < 65처럼 수학 표기 그대로 쓸 수 있는 게 편하다 (다른 언어는 0 < age && age < 65로 풀어써야 함).

정리

조건문 자체는 어렵지 않지만 순서 배치가 코드 품질을 갈랐다. 나중에 단어 퀴즈에서 "stop 입력 시 종료" 조건을 정답 비교 뒤에 놓으니 매번 두 번 비교하는 낭비가 생겼다. 종료 조건을 앞에 두면 정답 비교 자체가 스킵되니 훨씬 효율적. 매표소 예제에서 음수 방어를 넣어본 것도 실무 감각으로는 자연스럽지만 강의 요구사항만 보면 없어도 되는 조건이었는데, 이런 걸 스스로 넣는 습관을 들이는 게 중요할 것 같다.


5. 반복문

5.1 range() 함수 — 반복 횟수 발급기

반복 횟수를 숫자로 지정할 때 쓴다. 강사님 표현으로는 "번호표 발급기".

range(10)        # 0 ~ 9  (총 10개)
range(4, 11)     # 4 ~ 10 (총 7개, 뒤는 +1 규칙 동일)

5.2 for

정해진 시퀀스를 순회할 때 사용.

for i in range(10):
    print(i)          # 0, 1, 2, ..., 9

for i in range(4, 11):
    print(i)          # 4, 5, 6, ..., 10

문자열도 그대로 순회 가능:

words = input('단어를 입력하세요:')
for word in words:
    print(word)
# 안녕하세요 입력 시
# 안 / 녕 / 하 / 세 / 요 로 한 글자씩 출력

파이썬의 매력 포인트 — 인덱스 없이 값을 바로 꺼낼 수 있음.

5.3 while 문 — 조건 기반 반복

조건이 만족하는 동안 계속 반복. 종료 시점이 로직에 달려있다.

1부터 10까지 합:

total = 0
i = 1
while i <= 10:
    total = total + i
    i = i + 1          # ← 탈출 코드! 반드시 필요
print('1부터 10까지의 합은 %d입니다.' % (total))    # 55

⚠️ 탈출 코드(i = i + 1)가 없으면 무한루프. 조건이 영원히 참이라 브라우저 강제종료 해야한다. while을 쓸 때는 이 부분이 필수 요소이다.

5.4 while True + break 패턴

탈출 조건 없이 시작해서 특정 이벤트에서 빠져나오는 패턴이다. 게임 루프나 대화형 프로그램에 쓴다.

while True:                            # 무조건 반복 시작
    word = input('단어를 입력하세요: ')
    if word == 'stop':
        print('프로그램을 종료합니다.')
        break                          # 반복문 탈출
    print(word)

for 문 안에서도 break 사용 가능:

for i in range(1, 11):
    total = total + i
    if i == 5:
        break             # 5까지만 돌고 종료

실험용/디버깅용으로 특정 지점까지만 반복 돌릴 때 유용. 몇만 개 데이터 학습시키기 전에 10개만 돌려보는 식.

5.5 for vs while 비교

구분 for while
언제 쓰나 반복 횟수/구간이 정해져 있을 때 조건에 따라 반복시켜야 할 때
종료 range/시퀀스가 끝나면 자동 조건이 거짓이 되거나 break 실행
위험도 낮음 무한루프 가능 → 탈출 코드 필수
코드 길이 짧음 (같은 문제 기준) 길어짐

같은 "1부터 10까지 합" 문제도 for는 세 줄이면 끝나고, while은 다섯 줄 이상 필요. 구간이 명확하면 무조건 for가 경제적, 조건 종료가 필요하면 while.

정리

반복문 자체 개념은 다른 언어에서 봤어서 낯설진 않았다. 다만 파이썬의 for i in <시퀀스> 문법이 인덱스 안 챙기고 값을 바로 꺼낼 수 있다는 게 확실히 매력적이다. range 함수는 앞으로 계속 나올 것 같다. 무한루프 실수 경고는 남 얘기 같지 않아서 특히 조심해할 것 같다..


6. 자료구조

지금까지 변수 하나에 값 하나만 담았다면, 이제 여러 값을 한 번에 담는 방법. 세 가지가 있고 각각 목적이 다르다.

6.1 리스트 (List) — [ ]

"여러 값을 모을 수 있는 자료형". 한 줄 기차 같은 자료구조. 순서가 있고, 인덱스로 접근하며, 수정·추가·삭제 모두 가능.

생성

list1 = [1, 3, '사과', '딸기']       # 서로 다른 자료형도 한 리스트에 가능
list2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
list2 = list(range(1, 11))           # range와 조합해서 간편하게 생성

요소 추출 (문자열 인덱싱과 동일)

colors = ['빨강', '주황', '노랑', '초록', '파랑', '남색', '보라']
# 리스트 변수는 복수형으로 짓는 습관 (colors, animals ...)

colors[1]         # '주황'
colors[2:5]       # ['노랑', '초록', '파랑']   ← 슬라이싱 결과는 다시 리스트
colors[6]         # '보라'
colors[-1]        # '보라' (뒤에서 첫 번째)

한 개 추출 시 원본 자료형(문자열)으로, 슬라이싱 시 리스트로 반환된다는 차이가 중요.

요소 수정 — 덮어쓰기

colors[1] = '회색'
# ['빨강', '회색', '노랑', ...]

인덱스 자리에 값이 있으면 그 자리를 덮어쓰기. 뒤로 밀리지 않음.

요소 추가 append()

colors[7] = '금색'          # ❌ IndexError: list assignment index out of range
colors.append('금색')       # ✅ 리스트 맨 뒤에 추가

없는 인덱스에 직접 대입은 오류. 반드시 append()로 뒤에 붙여야 함.

요소 삽입 insert() — 특정 자리에 끼워넣기

colors.insert(0, '은색')    # 0번 자리에 '은색' 삽입, 뒤 요소들이 한 칸씩 밀림

요소 삭제 remove()

colors.remove('은색')       # 값으로 지정해서 삭제

요소 잘라내기 pop() — 삭제 + 반환

color = colors.pop(1)       # 1번 자리 요소를 꺼내면서 삭제
# color 변수에 담기고, colors에서는 사라짐

remove()는 그냥 지우기, pop()은 잘라내기(잘라낸 값을 다른 곳에 옮길 수 있음).

리스트 병합 +

merge_list = list1 + list2 + colors
# 순서대로 이어붙여짐

+ 하나로 리스트 결합. 다른 언어라면 반복문이나 concat 함수가 필요한 작업.

순서 뒤집기 reverse()

list2.reverse()             # 원본이 뒤집힘 (주의)

정렬 sort()

colors.sort()                    # 기본값: 오름차순 (ㄱ~ㅎ, a~z)
colors.sort(reverse=True)        # 내림차순

기본값이 오름차순이라는 것 기억. 한글은 자모순으로 정렬됨.

리스트를 for 문으로 순회

for color in colors:
    print('나는 %s를 좋아합니다.' % (color))

6.2 튜플 (Tuple) — ( )

"여러 값을 모을 수 있는 자료형 + 한 번 생성하면 수정 불가" = 리스트의 읽기 전용 버전.

생성

animals = ('토끼', '거북이', '사자', '여우')

접근 — 리스트와 동일

animals[0]        # '토끼'
animals[0:2]      # ('토끼', '거북이')   ← 결과도 튜플

수정 시도하면?

animals[0] = '고양이'
# TypeError: 'tuple' object does not support item assignment

왜 튜플을 쓰나?

보안/보존 목적. 절대 바뀌면 안 되는 데이터 저장 시 사용.

# 관리자 정보 저장
admin_info = ('admin', '12345', 'master@naver.com')
print(admin_info[0])   # admin
print(admin_info[1])   # 12345
print(admin_info[2])   # master@naver.com
  • 함수 사이로 데이터를 안전하게 넘길 때
  • 원본이 절대 바뀌면 안 되는 상수 데이터
  • 병합(+)은 가능하지만 중간 삽입/수정/삭제는 안 됨

6.3 딕셔너리 (Dictionary) — { }

"키(key)와 값(value)의 쌍으로 데이터를 저장". 인덱스 번호가 아니라 내가 지은 이름으로 값에 접근.

생성

member = {
    'name': '장성연',
    'age': 42,
    'id': 'admin',
    'password': 1234
}
print(member)
# {'name': '장성연', 'age': 42, 'id': 'admin', 'password': 1234}

접근

member['name']       # '장성연'

키가 열쇠 역할. 열쇠(키)를 넣으면 그 자리의 값이 나옴.

수정/추가

member['name'] = '오재원'         # 키가 있으면 → 덮어쓰기
member['email'] = 'admin@naver.com'  # 키가 없으면 → 새로 추가

리스트/튜플과 결정적 차이: 없는 키에 값을 넣어도 오류가 아니라 그냥 추가된다. 인덱스 범위를 신경 쓸 필요가 없음. 확장성이 가장 큰 자료구조인 이유.

전체 삭제 clear()

member.clear()      # {}

데이터를 담았다가 다시 담는 반복 작업에서 유용.

for 문에서 사용 — 주의점

리스트/튜플의 for 문은 을 건네지만, 딕셔너리의 for 문은 를 건넨다.

for key in member:       # key만 넘어옴
    print(member[key])   # 값이 필요하면 다시 조회해야 함

6.4 실습 — 영어 단어 퀴즈 프로그램

딕셔너리 + while True + break + if/elif/else 총출동.

words = {'꽃': 'flower', '나비': 'butterfly', '학교': 'school', '자동차': 'car'}

print('***영어 단어 맞추기 퀴즈 시작***')

for key in words:
    input_word = input('%s에 해당되는 영어 단어를 입력하세요: ' % key)

    if input_word == 'stop':          # 종료 조건을 앞에 배치 (효율)
        print('퀴즈를 종료합니다.')
        break
    elif input_word == words[key]:
        print('정답입니다.')
    else:
        print('오답입니다.')

print('***영어 단어 맞추기 퀴즈 끝***')

주요 포인트:

  • for key in words로 딕셔너리 키를 순회
  • words[key]로 정답 값을 조회
  • stop 조건을 정답 비교보다 먼저 배치해서 불필요한 비교를 스킵
  • while True 대신 for로도 종료 로직을 넣을 수 있음을 확인

6.5 세 자료구조 비교 요약

구조 기호 순서 수정 접근 방식 주 용도
리스트 [ ] O O 인덱스 (숫자) 순서 있는 데이터, 자주 바뀌는 값
튜플 ( ) O 인덱스 (숫자) 보호가 필요한 데이터, 읽기 전용
딕셔너리 { } X (키 기반) O 키 (이름) 이름-값 매핑, 확장성 중요할 때

정리

튜플의 존재 이유가 처음엔 애매했는데, "함수 사이로 데이터를 안전하게 넘길 때 중간에 조작 못 하게" 라는 관점에서 이해가 됐다. 딕셔너리는 pandas의 컬럼 접근과 감각이 같다고 하니 미리 익숙해두면 좋을 것 같음.

헷갈릴 만한 세 지점 확실히 정리:

  1. 리스트 슬라이싱 결과 → 리스트
  2. 튜플 슬라이싱 결과 → 튜플
  3. 딕셔너리 for 순회 → 만 넘어옴 (값은 다시 조회 필요)

이 세 개는 자주 실수할 지점이라 손에 익을 때까지 반복하자.


오늘의 총평

문법 자체는 4학년까지 오면서 대부분 접해본 개념이었지만, 파이썬만의 편의성(음수 인덱스, 슬라이싱 표기법, 자료형 자동 판정, 리스트 + 이어붙이기, 다중 조건 수학 표기, 문자열 반복 연산자 등)이 어디에서 나오는지 감을 잡는 시간이었다. 그동안 AI 붙여쓰기로 대충 넘어갔던 부분들이 오늘 코드를 손으로 치면서 "아 이래서 이 언어를 쓰는구나" 하는 순간이 여러 번 있었다.

특히 인상 깊었던 포인트:

  1. input()은 무조건 문자열 반환 → 형변환 습관 필수
  2. while 루프는 탈출 코드가 필수 → 안 넣으면 브라우저 강제종료
  3. for vs while은 상황 따라 골라야 함 → 구간이면 for, 조건이면 while
  4. 자료구조 선택도 설계의 일부 → 리스트냐 튜플이냐 딕셔너리냐는 취향이 아니라 데이터 성격에 맞춰야 함
  5. AI에게 코드 부탁할 때도 문법을 알아야 검토가 가능 → 자릿수 미세 조정 같은 걸 AI에 다시 시키느니 직접 아는 게 훨씬 빠름
  6. 조건문의 순서 배치도 성능/가독성에 영향 → 종료 조건은 앞으로

 파이썬 기본기는 앞으로 계속 밑바탕이 될 텐데, 오늘 문법을 그냥 "아 이거 해봤음"으로 넘기지 말고 손에 확실히 익혀두자.