← 보드클래스와 상속 · 3/12
메서드와 상태 변화 따라가기 ★★
메서드는 보통 객체의 attribute 값을 바꾸거나 읽는 일을 해요. 시험 코드는 "메서드를 순서대로 호출한 뒤 값이 얼마인가?"를 자주 물어요. 이럴 때는 attribute 값을 적은 상태표를 만들어 한 줄씩 고쳐 가요.
class Car:
def __init__(self, brand, speed=0):
self.brand = brand
self.speed = speed
def accelerate(self, amount):
self.speed += amount
def brake(self, amount):
self.speed = max(0, self.speed - amount)
def show_state(self):
print(f"{self.brand}: {self.speed} km/h")
my_car = Car("Hyundai")
my_car.show_state()
my_car.accelerate(30)
my_car.show_state()
my_car.brake(20)
my_car.show_state()
my_car.brake(20)
my_car.show_state()
Hyundai: 0 km/h
Hyundai: 30 km/h
Hyundai: 10 km/h
Hyundai: 0 km/h
| 실행하는 줄 | speed | 설명 |
|---|---|---|
my_car = Car("Hyundai") | 0 | speed를 안 넘겨서 기본값 0이 들어가요 |
show_state() | 0 | "Hyundai: 0 km/h" 출력 (값은 안 바뀜) |
accelerate(30) | 30 | +=는 "더해서 다시 저장". 0+30. 출력은 없어요 |
show_state() | 30 | "Hyundai: 30 km/h" 출력 |
brake(20) | 10 | max(0, 30−20) = max(0, 10) = 10 |
show_state() | 10 | "Hyundai: 10 km/h" 출력 |
brake(20) | 0 | max(0, 10−20) = max(0, −10) = 0. 음수로 안 내려가요 |
show_state() | 0 | "Hyundai: 0 km/h" 출력 |
주의할 점은 accelerate나 brake는 값만 바꾸고 화면에 아무것도 찍지 않는다는 거예요. 출력은 show_state()를 호출했을 때만 나와요. 교수님이 "함수는 한 가지 일만 하고, 보여주는 건 show_state()가 맡는 게 이 클래스의 설계"라고 했어요. 그래서 출력은 print가 있는 메서드를 호출한 횟수와 같아요(여기서는 4줄).
조건문이 들어간 예도 하나 볼게요. 은행 계좌예요.
class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner
self.balance = balance
def deposit(self, amount):
if amount > 0:
self.balance += amount
def withdraw(self, amount):
if amount <= self.balance:
self.balance -= amount
print(f"{amount}원 출금 완료")
else:
print(f"잔액이 부족합니다. (현재잔액: {self.balance})")
def show_balance(self):
print(f"{self.owner}의 잔액: {self.balance}원")
account = BankAccount("Lee", 10000)
account.deposit(5000)
account.withdraw(3000)
account.withdraw(20000)
account.show_balance()
3000원 출금 완료
잔액이 부족합니다. (현재잔액: 12000)
Lee의 잔액: 12000원
| 실행하는 줄 | balance | 설명 |
|---|---|---|
BankAccount("Lee", 10000) | 10000 | owner = "Lee", balance = 10000 |
deposit(5000) | 15000 | 5000 > 0이 True라서 더해요. 출력 없음 |
withdraw(3000) | 12000 | 3000 <= 15000이 True → 빼고 "3000원 출금 완료" 출력 |
withdraw(20000) | 12000 | 20000 <= 12000은 False → else 쪽. 값은 그대로, "잔액이 부족합니다…" 출력 |
show_balance() | 12000 | "Lee의 잔액: 12000원" 출력 |
기본값(balance=0)이 있는 인자는 안 넘겨도 되지만, 기본값이 없는 인자를 빠뜨리면 에러(TypeError)가 나요. 예를 들어 Student("Kim")처럼 score를 빼면 에러예요.
시험엔 이렇게 써요 — 이렇게 고르세요
메서드는 instance의 attribute를 읽거나 변경한다. 결과 예측은 ① attribute 상태표를 만들고 ② 메서드를 호출 순서대로 실행하며 값을 고치고 ③ print가 있는 메서드에서만 출력을 적는다. 값을 바꾸는 메서드와 보여 주는 메서드를 구분하세요.
잠깐 확인 — Car 예제에서 my_car.accelerate(30) 한 줄만 실행하면 화면에 무엇이 나오나요?
아무것도 안 나와요. accelerate는 speed 값만 바꾸고 print를 하지 않아요.
다음 카드 → 객체마다 다른 값 vs 모두가 같이 쓰는 값 — instance attribute와 class attribute
자료: 3~4주차 · Week03_Class_for_PyTorch(pdf, ipynb 업데이트본) · 빅데이터03(3주차)·빅데이터04(4주차) 녹취