학습 기록
Python 공부 기록 #5 - 코드를 레고처럼 조립하기 (클래스, 모듈, 스코프)
- 목차
인트로: 함수 다음 단계는?
클래스(Class): 붕어빵 틀과 설계도
모듈(Module): 남이 만든 훌륭한 도구상자
스코프(Scope): 내 책상 vs 공용 테이블
아웃트로: 이제 문법 공부는 끝났습니다
인트로: 함수 다음 단계는?
지난 시간(#4)에 함수(def)를 배우면서 ’라면 자판기’를 만들어봤습니다. 덕분에 반복되는 ‘복붙’ 지옥에서 탈출할 수 있었죠.
그런데 코딩을 계속하다 보니 욕심이 생기더군요. 라면 자판기 하나 만드는 걸 넘어서, ’라면 가게 프랜차이즈’를 내고 싶다면요?
혹은 다른 사람이 잘 만들어 둔 ’최신형 키오스크’를 가져와서 내 가게에 설치하고 싶다면 어떻게 해야 할까요?
오늘은 파이썬 문법의 꽃이라 불리는 ’클래스(Class)’와, 이미 만들어진 기능을 레고처럼 가져다 쓰는 ’모듈(Module)’에 대해 정리해 봅니다.
이 단계만 넘으면 이제 “나 파이썬 문법 웬만큼 알아”라고 말할 수 있다고 합니다!
- 클래스(Class): 붕어빵 틀과 설계도
클래스가 뭔가요?
이 개념이 비전공자에게 가장 어렵다고 하던데, ’설계도’라고 생각하니 이해가 쉬웠습니다.
클래스(Class): 설계도 (또는 붕어빵 틀)
객체(Object): 설계도로 만든 실제 건물 (또는 팥붕어빵, 슈크림붕어빵)
은행 계좌로 이해하는 클래스
가장 이해하기 쉬운 ‘은행 계좌’ 예시를 들어볼게요.
class BankAccount:
init : 계좌를 처음 개설할 때 실행되는 것 (생성자)
def init(self, owner, money):
self.owner = owner # 예금주
self.balance = money # 잔액
입금 기능
def deposit(self, amount):
self.balance += amount
print(f“{amount}원 입금 완료! 잔액: {self.balance}원“)
설계도로 실제 계좌(객체) 만들기
my_account = BankAccount(“제이엠”, 10000)
my_account.deposit(5000)
출력: 5000원 입금 완료! 잔액: 15000원
self가 뭔지 한참 헤맸습니다
처음에 이 self가 제일 헷갈렸어요. 왜 매번 써야 하는지 이해가 안 갔거든요.
결론: self = “이 계좌 자체”를 가리키는 대명사입니다.
실제 상황으로 비유하면:
은행 창구에서
직원: “어느 계좌에 입금하실 건가요?”
나: “제 계좌요.” (← 이게 self)
직원: “네, 제이엠님 계좌에 입금하겠습니다.”
my_account로 만들면 → self는 my_account
wife_account로 만들면 → self는 wife_account
함수 정의할 때는 self를 꼭 써야 하는데, 함수를 호출할 때는 안 써도 됩니다. (자동으로 전달되거든요)
함수 정의할 때: self 필수
def deposit(self, amount):
self.balance += amount
함수 호출할 때: self 안 씀
my_account.deposit(5000) # 파이썬이 알아서 self에 my_account를 넣어줌
처음엔 이상했는데, 몇 번 써보니 이제 익숙해졌습니다.
클래스의 장점
이렇게 class로 묶어두면, my_account, wife_account처럼 변수만 다르게 해서 계좌를 무한대로 찍어낼 수 있습니다.
account1 = BankAccount(“제이엠”, 10000)
account2 = BankAccount(“망곰이”, 50000)
각 계좌가 독립적으로 작동
account1.deposit(5000) # 제이엠 계좌만 증가
account2.deposit(2000) # 망곰이 계좌만 증가
참고: 상속(Inheritance)이란 기능도 있는데, 기존 설계도를 복사해서 ’테라스’만 추가하는 것처럼 기능을 확장할 때 쓴다고 합니다. 이건 나중에 필요할 때 배워도 된다고 해요!
- 모듈(Module): 남이 만든 훌륭한 도구상자
모듈이 뭔가요?
파이썬이 강력한 이유는 전 세계 개발자들이 미리 만들어둔 도구(모듈)가 엄청나게 많기 때문입니다.
우리는 import라는 주문만 외우면 됩니다.
① random 모듈: 점심 메뉴 고를 때 딱입니다
import random
menus = [“김치찌개”, “돈까스”, “제육볶음”]
print(random.choice(menus)) # 결정장애 해결!
실행할 때마다 다른 메뉴가 나옵니다. 회사에서 점심 메뉴 정할 때 진짜 유용하더라고요.
② datetime 모듈: 날짜 계산할 때 필수!
import datetime
today = datetime.date.today()
print(today) # 오늘 날짜 출력
D-Day 계산 (프로젝트 마감일까지)
deadline = datetime.date(2026, 3, 31)
days_left = (deadline - today).days
print(f“마감까지 {days_left}일 남았습니다.”)
엑셀로 날짜 계산하던 게 코드 한 줄로 끝나니 신기했습니다.
③ pathlib 모듈: 파일 경로 다룰 때 씁니다
윈도우/맥 경로 차이(\ vs /) 때문에 스트레스받을 때 유용합니다.
from pathlib import Path
현재 폴더의 모든 엑셀 파일 찾기
current_folder = Path.cwd()
excel_files = list(current_folder.glob(“*.xlsx”))
print(f“엑셀 파일 {len(excel_files)}개 발견”)
☑️ import 방법 3가지
처음엔 어떤 방법을 써야 할지 고민했는데, 지금은 상황에 맞게 쓰고 있습니다.
방법 1: 모듈 전체 가져오기
import random
random.choice([1, 2, 3])
방법 2: 특정 함수만 가져오기 (제가 주로 쓰는 방법)
from random import choice
choice([1, 2, 3])
방법 3: 별명 붙이기 (이름이 길 때 편함)
import datetime as dt
today = dt.date.today()
- 스코프(Scope): 내 책상 vs 공용 테이블
코딩하다 보면 “어? 변수가 왜 없다고 하지?“라는 에러를 자주 만납니다. 저도 처음에 이거 때문에 한참 헤맸어요.
이게 변수의 유효 범위(Scope) 때문이라네요.
지역 변수(Local): 함수 안에서 만든 변수. 함수가 끝나면 사라집니다.
전역 변수(Global): 함수 밖에서 만든 변수. 어디서든 볼 수 있습니다.
global_var = “전역”
def my_func():
local_var = “지역”
print(global_var) # 가능 (전역이니까)
my_func()
print(local_var) # 에러 발생! (함수 밖에서는 안 보임)
☑️ 전역 변수를 수정하고 싶을 때
처음에 이것 때문에 에러가 계속 났었는데, global 키워드를 써야 한다는 걸 알았습니다.
counter = 0
def increase():
global counter # “전역 변수를 수정하겠다”는 선언
counter += 1
print(f“카운터: {counter}”)
increase() # 카운터: 1
increase() # 카운터: 2
global을 안 쓰면 UnboundLocalError가 뜹니다.
처음에 이 에러 메시지 보고 멘붕왔는데, 이제는 “아, global 안 썼구나” 하고 바로 알아챕니다.
☑️실무에서는 어떻게 쓰나요?
찾아보니 전역 변수는 최소한으로 쓰는 게 좋다고 하더라고요. 코드가 커지면 누가 어디서 변수를 바꿨는지 추적하기 어렵다고 합니다.
그래서 요즘은 함수 매개변수로 전달하거나 클래스 속성으로 관리하는 쪽으로 코딩하고 있습니다.
- 정리하며
축하해 주세요! 🎉 오늘로 파이썬의 핵심 문법(변수, 제어문, 함수, 클래스, 모듈) 정리가 끝났습니다.
이제 레고 블록은 다 모았으니, 무엇을 만들지 아이디어만 가지고 있으면 되겠죠?
사실, 바이브 코딩 시대에 이 부분이 제일 어려운 것 같지만요😅
다음 포스팅부터는 진짜 실전입니다.
내 컴퓨터 안에서만 노는 게 아니라, 인터넷 세상을 돌아다니며 데이터를 긁어오는 ’웹 통신(HTTP)’과 ’크롤링 기초’에 대해 정리해 보겠습니다.
혹시 설명 중에 틀린 부분이 있거나 더 좋은 팁이 있다면 댓글로 알려주세요! 같이 공부해요. 😊