학습 기록

Python 공부 기록 #5 - 코드를 레고처럼 조립하기 (클래스, 모듈, 스코프)

  1. 목차

인트로: 함수 다음 단계는?

클래스(Class): 붕어빵 틀과 설계도

모듈(Module): 남이 만든 훌륭한 도구상자

스코프(Scope): 내 책상 vs 공용 테이블

아웃트로: 이제 문법 공부는 끝났습니다

인트로: 함수 다음 단계는?

지난 시간(#4)에 함수(def)를 배우면서 ’라면 자판기’를 만들어봤습니다. 덕분에 반복되는 ‘복붙’ 지옥에서 탈출할 수 있었죠.

그런데 코딩을 계속하다 보니 욕심이 생기더군요. 라면 자판기 하나 만드는 걸 넘어서, ’라면 가게 프랜차이즈’를 내고 싶다면요?

혹은 다른 사람이 잘 만들어 둔 ’최신형 키오스크’를 가져와서 내 가게에 설치하고 싶다면 어떻게 해야 할까요?

오늘은 파이썬 문법의 꽃이라 불리는 ’클래스(Class)’와, 이미 만들어진 기능을 레고처럼 가져다 쓰는 ’모듈(Module)’에 대해 정리해 봅니다.

이 단계만 넘으면 이제 “나 파이썬 문법 웬만큼 알아”라고 말할 수 있다고 합니다!

  1. 클래스(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)이란 기능도 있는데, 기존 설계도를 복사해서 ’테라스’만 추가하는 것처럼 기능을 확장할 때 쓴다고 합니다. 이건 나중에 필요할 때 배워도 된다고 해요!

  1. 모듈(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()

  1. 스코프(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 안 썼구나” 하고 바로 알아챕니다.

☑️실무에서는 어떻게 쓰나요?

찾아보니 전역 변수는 최소한으로 쓰는 게 좋다고 하더라고요. 코드가 커지면 누가 어디서 변수를 바꿨는지 추적하기 어렵다고 합니다.

그래서 요즘은 함수 매개변수로 전달하거나 클래스 속성으로 관리하는 쪽으로 코딩하고 있습니다.

  1. 정리하며

축하해 주세요! 🎉 오늘로 파이썬의 핵심 문법(변수, 제어문, 함수, 클래스, 모듈) 정리가 끝났습니다.

이제 레고 블록은 다 모았으니, 무엇을 만들지 아이디어만 가지고 있으면 되겠죠?

사실, 바이브 코딩 시대에 이 부분이 제일 어려운 것 같지만요😅

다음 포스팅부터는 진짜 실전입니다.

내 컴퓨터 안에서만 노는 게 아니라, 인터넷 세상을 돌아다니며 데이터를 긁어오는 ’웹 통신(HTTP)’과 ’크롤링 기초’에 대해 정리해 보겠습니다.

혹시 설명 중에 틀린 부분이 있거나 더 좋은 팁이 있다면 댓글로 알려주세요! 같이 공부해요. 😊