while문
1. 기본 구조와 반복 (while vs if)
if 문은 조건이 맞으면 딱 한 번만 실행하지만, while 문은 조건이 거짓이 될 때까지 계속 실행합니다.
# 0부터 4까지 1씩 증가하며 출력
count = 0
while count < 5:
count += 1
if count == 3:
break # 3이 되면 반복 종료
print(count)
print("끝") # 1, 2 출력 후 "끝" 출력
2. 제어 명령어 (break, continue)
반복문의 흐름을 강제로 조절할 때 사용합니다.
- break: 반복문 전체를 즉시 종료합니다.
- continue: 나머지 코드를 건너뛰고 반복문의 처음(조건 확인)으로 돌아갑니다.
# 커피 판매 로직 중 거스름돈 부족 상황
if money < perMoney:
print("금액이 부족합니다.")
continue # 아래 코드를 실행하지 않고 다시 '돈을 넣어주세요'로 이동
3. 무한 루프 (while True)
종료 조건을 미리 알 수 없거나, 특정 상황에서 break를 만나기 전까지 계속 실행해야 할 때 사용합니다. 자판기나 주차 관리 프로그램처럼 "언제 끝날지 모르는 반복"을 처리할 때 필수
# 주차장 만차 확인 로직
while True:
car = input("차량 들어왔나요(y/n)?")
if car.lower() == "y":
seats -= 1
if seats == 0:
print("만차입니다.")
break # seats가 0이 되면 무한 루프 탈출
4. 자료구조(리스트/딕셔너리)와 함께 사용하기
while 문은 데이터의 개수가 줄어들 때까지 반복하는 작업에 매우 유용합니다.
주의: while 문은 **'참/거짓'**을 판단하므로, 딕셔너리의 전체 재고 합계가 0보다 큰지 확인하거나 데이터를 하나씩 뽑아내는 방식을 써야 합니다.
# 딕셔너리 단어장 학습 예시
words = list(word_dict.items()) # [('apple', '사과'), ('banana', '바나나'), ...]
while words:
word, mean = words[0] # 첫 번째 데이터 추출
ans = input(f"{word}의 뜻을 입력하세요: ")
if ans == mean:
print("통과!")
words.pop(0) # 맞추면 리스트에서 제거 (리스트가 비면 while 종료)
else:
wrong_count += 1
if wrong_count > 1:
print("Game Over")
break
함수
1. 함수의 기본 구조
함수는 반복되는 코드를 하나로 묶어 필요할 때마다 호출하여 사용하는 코드의 집합, 선언(정의)하고 호출함으로써 작동합니다.
- 정의 (Definition): def 함수이름(매개변수): 로 작성합니다.
- 호출 (Call): 함수이름()으로 실행합니다.
# 함수의 정의
def print_menu():
print("=== 메뉴 ===")
print("1. 실행")
# 함수의 호출
print_menu()
2. 매개변수와 반환값 (Data Flow)
함수는 외부에서 데이터를 받아(매개변수), 내부에서 처리한 뒤, 그 결과를 돌려줄(반환값) 수 있습니다.
- 매개변수(Parameter): 함수가 처리할 데이터를 받는 통로. (예: add_task(todo_list))
- 반환값(Return): 함수 수행 후 최종 결과물을 밖으로 보내주는 것. (예: return balance)
# 데이터를 받아서 처리하고 결과를 돌려주는 함수
def add_income(balance):
money = int(input("금액:"))
balance += money # 내부 로직
return balance # 처리된 결과를 밖으로 전달
Q. 함수 사용의 장점 (Why?)
- 재사용성: 똑같은 코드를 여러 번 짤 필요 없이 한 번만 만들면 계속 쓸 수 있습니다.
- 가독성: main() 함수를 보면 프로그램 전체 흐름이 무엇인지 한눈에 알 수 있습니다.
- 유지보수: 기능을 수정하고 싶을 때 그 함수 내부만 고치면 됩니다. (예: 메뉴 디자인을 바꾸고 싶다면 print_menu 함수만 수정)
3. 함수로 정리된 코드의 흐름 (모듈화)
작성하신 main() 함수를 보면 프로그램이 어떻게 동작하는지 아주 잘 나타나 있습니다.
def main():
todo_list = [] # 데이터(상태) 정의
while True:
print_menu() # UI 출력
choice = input("선택: ") # 이벤트 입력
if choice == "1": # 기능 분기 처리
add_task(todo_list)
elif choice == "2":
show_tasks(todo_list)
# ... 이하 생략
이렇게 기능을 함수 단위로 쪼개는 것을 '모듈화(Modularization)'
클래스
1. 클래스 기본구조
데이터(변수)와 기능(함수)을 하나의 틀로 묶어놓은 설계도
- __init__ (생성자): 클래스로부터 객체를 처음 만들 때 자동으로 실행되며, 변수(프로퍼티)를 초기화하는 역할을 합니다.
- 클래스로부터 객체를 만들 때 처음 시작할 때 꼭 필요한 정보를 세팅하는 함수
class Student:
def __init__(self, name, age):
self.name = name # 초기값으로 이름 저장
self.age = age # 초기값으로 나이 저장
s1 = Student("김철수", 20)
print(s1.name) # 김철수
- self: "내 것"이라는 뜻으로, 클래스 내부에서 자기 자신의 변수나 함수에 접근할 때 반드시 필요합니다. (JS의 this와 동일)
class Dog:
def __init__(self, name):
self.name = name # self.name에 저장됨
def bark(self):
# self.name을 써야 내 이름이 무엇인지 알 수 있음
print(f"{self.name}가 멍멍!")
d1 = Dog("바둑이")
d1.bark() # 바둑이가 멍멍!
- 메소드(Method): 클래스 내부에 정의된 함수입니다. 파라미터에 항상 self를 넣어주어야 합니다.
- 개념: 데이터를 조회하거나 수정하는 클래스만의 전용 기능입니다.
class BankAccount:
def __init__(self):
self.balance = 0 # 처음 잔액은 0원
# 데이터를 수정하는 전용 메소드
def deposit(self, amount):
self.balance += amount
print(f"{amount}원 입금 완료.")
my_money = BankAccount()
my_money.deposit(1000) # 메소드를 실행하여 상태 변경
- 인스턴스 (Instance): 클래스로 만든 실제 물건, 클래스는 '설계도'이고, 인스턴스는 그 설계도로 만든 '실제 객체'입니다.
- 개념: 아파트 설계도(클래스) 하나만 있으면, 수백 명의 사람이 실제 아파트(인스턴스)에 들어가 살 수 있는 것과 같습니다.
class Car:
def __init__(self, color):
self.color = color
# 같은 설계도로 서로 다른 객체 2개를 만듦
car1 = Car("빨간색")
car2 = Car("파란색")
print(car1.color) # 빨간색
print(car2.color) # 파란색
* os 라이브러리
파이썬에서 운영체제(Operating System)와 상호작용하기 위해 사용하는 표준 라이브러리
(파이썬 코드를 통해 파일을 열거나, 폴더를 만들고, 현재 컴퓨터의 환경을 제어하는 등의 "컴퓨터 관리 업무"를 할 수 있게 해줍니다.)
- 1. 화면 정리
여러분이 가계부나 할 일 관리 프로그램에서 clear() 함수를 만들 때 사용한 기능 운영체제마다 화면을 지우는 명령어가 달라서 이를 구분해 주는 역할
import os
# os.name이 'nt'(윈도우)면 'cls' 명령어를,
# 아니면(맥/리눅스) 'clear' 명령어를 실행합니다.
os.system('cls' if os.name == 'nt' else 'clear')
- 2. 파일 및 디렉토리(폴더) 관리
파일을 찾거나, 폴더를 생성하고, 이름을 바꾸는 등의 작업이 가능
import os
# 1. 현재 내가 위치한 경로 확인
print(os.getcwd())
# 2. 새로운 폴더 만들기
if not os.path.exists("data"):
os.mkdir("data")
# 3. 폴더 안의 파일 목록 확인하기
print(os.listdir('.'))
- 3. 환경 변수 및 시스템 정보
컴퓨터의 환경 변수를 가져오거나, 파일의 경로를 운영체제에 맞게 자동으로 합쳐주는 등의 정교한 작업이 가능
import os
# 운영체제에서 설정된 환경 변수(예: 경로 정보 등) 가져오기
print(os.environ.get('PATH'))
# 파일 경로를 운영체제에 맞게 안전하게 합치기 (윈도우는 \, 맥은 /)
path = os.path.join("users", "project", "data.txt")
print(path)
JSON
1. 직렬화(Serialization)와 역직렬화(Deserialization)
파이썬의 객체(리스트, 딕셔너리 등)를 네트워크로 보내거나 파일에 쓰기 위해 '문자열(String)'로 변환하는 것을 직렬화라고 합니다.
- json.dumps(): 파이썬 객체를 JSON 문자열로 변환 (serialize)
- json.loads(): JSON 문자열을 파이썬 객체로 변환 (deserialize)
import json
data = {"이름": "김철수", "나이": 35}
# 1. 파이썬 객체 -> JSON 문자열
json_string = json.dumps(data, ensure_ascii=False)
print(type(json_string)) # <class 'str'>
# 2. JSON 문자열 -> 파이썬 객체
python_obj = json.loads(json_string)
print(type(python_obj)) # <class 'dict'>
2. 파일 입출력 (dump vs load)
문자열을 거치지 않고 파일에 직접 저장하거나 불러올 때는 dump와 load를 사용합니다.
- json.dump(): 파이썬 객체를 파일로 바로 저장
- json.load(): 파일에서 읽어와 파이썬 객체로 변환
# 파일로 저장 (dump)
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False)
# 파일에서 읽기 (load)
with open("data.json", "r", encoding="utf-8") as f:
loaded_data = json.load(f)
print(loaded_data)
3. with 문을 사용하는 이유
파일을 다룰 때 with 구문을 사용하는 것은 아주 중요한 습관입니다.
- 개념: 파일을 열고 작업이 끝나면 자동으로 파일을 닫아줍니다(close).
* 이유: 파일을 열고 닫지 않으면 메모리 누수가 발생하거나, 다른 프로세스가 그 파일을 수정하지 못하도록 잠겨버리는(Lock) 문제가 생길 수 있습니다. with 문은 이런 실수를 원천 차단합니다.
느낀점
오늘은 초반에 다소 천천히가다가 갑자기 급하게 진도를 확 뺀 느낌이다. 예전에 파이썬을 공부할 때 클래스 부분부터 공부를 안해 개념적부분이 부족해 이해는 해도 바로 혼자 기본구조를 잡고 나아가는데 아직 어려움이 있었던 것 같다. 오늘 과제로 연락처 관리 프로그램을 만드는 것을 했는데 혼자 기본구조 잡고 코드를 써내려가는데에 아주 큰 난관이였던 것 같다. 과제를 하는데 LLM도움을 받더라도 주말에 복습을 하며 꼭 다시 코드를 써봐야할 것 같다.
——————————————————————————
본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.
'학습일지' 카테고리의 다른 글
| [스나이퍼팩토리] 한컴AI아카데미(26.04.28) (0) | 2026.04.28 |
|---|---|
| [스나이퍼팩토리] 한컴AI아카데미(26.04.27) (0) | 2026.04.28 |
| [스나이퍼팩토리] 한컴AI아카데미(26.04.23) (0) | 2026.04.23 |
| [스나이퍼팩토리] 한컴AI아카데미(26.04.22) (0) | 2026.04.22 |
| [스나이퍼팩토리] 한컴AI아카데미(26.04.21) (0) | 2026.04.21 |