🎯 학습 목표
- 클래스와 객체(인스턴스)의 관계를 이해한다.
- __init__과 메서드로 클래스를 정의한다.
- 상속으로 기존 클래스를 확장한다.
📖 클래스는 “설계도”, 객체는 “제품”
클래스(class)는 데이터(속성)와 기능(메서드)을 하나로 묶는 설계도입니다. 그 설계도로 찍어낸 실제 물건이 객체(object) = 인스턴스(instance)입니다. “붕어빵 틀(클래스)”과 “구워 나온 붕어빵들(객체)”의 관계입니다. 객체지향은 관련된 데이터와 동작을 한곳에 모아 복잡한 프로그램을 정리하는 방식입니다.
💻 클래스 정의하기
class Dog:
def __init__(self, name, age): # 생성자: 객체 만들 때 자동 호출
self.name = name # self.속성 = 객체의 데이터
self.age = age
def bark(self): # 메서드: 객체의 기능
return f"{self.name}: 멍멍!"
# 객체(인스턴스) 만들기
d1 = Dog("바둑이", 3)
d2 = Dog("뽀삐", 5)
print(d1.name) # 바둑이 속성 접근
print(d1.bark()) # 바둑이: 멍멍! 메서드 호출
print(d2.bark()) # 뽀삐: 멍멍!
self는 “그 객체 자신”을 가리킵니다. 메서드의 첫 매개변수는 항상 self이고, self.name처럼 객체의 데이터에 접근합니다. __init__은 객체가 만들어질 때 자동 실행되어 초기 속성을 세팅하는 생성자입니다.
💻 상속 — 기존 클래스를 물려받아 확장
class Animal:
def __init__(self, name):
self.name = name
def eat(self):
return f"{self.name}가 먹는다"
class Cat(Animal): # Animal을 상속
def meow(self): # 새 기능 추가
return f"{self.name}: 야옹"
c = Cat("나비")
print(c.eat()) # 나비가 먹는다 ← 부모의 기능 그대로 사용
print(c.meow()) # 나비: 야옹 ← 자식의 새 기능
상속은 공통 기능을 부모 클래스에 두고, 자식 클래스가 물려받아 추가·변경하는 것입니다. 중복을 줄이고 구조를 깔끔하게 만듭니다.
💻 메서드 오버라이딩 — 부모 기능 재정의
class Animal:
def sound(self):
return "..."
class Dog(Animal):
def sound(self): # 같은 이름으로 덮어쓰기
return "멍멍"
class Cat(Animal):
def sound(self):
return "야옹"
for a in [Dog(), Cat()]:
print(a.sound()) # 멍멍 / 야옹 (같은 호출, 다른 동작)
⚠️ 주의사항
- 메서드의 첫 매개변수
self를 빠뜨리면 에러가 납니다. 호출할 때는self에 값을 직접 넘기지 않습니다(d1.bark()— 파이썬이 자동으로 d1을 self로 전달). - 클래스 이름은 관례상 대문자로 시작(PascalCase)합니다:
Dog,BankAccount.
🧭 마무리 & 다음 단계
- 이 강좌 요약: 변수·자료형(1·2강) → 자료구조(3강) → 제어문(4강) → 함수(5강) → 모듈·예외·파일(6강) → 클래스(7강). 파이썬으로 프로그램을 만드는 기본기를 모두 다뤘습니다.
- 다음 단계: 표준 라이브러리 더 익히기, 가상환경(venv)과 pip로 외부 패키지 쓰기, 그리고 관심 분야(웹=Flask/Django, 데이터=pandas, 자동화 등)로 확장.
- 꾸준히 작은 프로그램을 직접 만들어 보는 것이 가장 빠른 길입니다.