Python 강좌 / 클래스와 인스턴스: 상태와 동작 묶기
클래스는 관련 데이터와 동작을 묶는 정의이고 인스턴스는 그 정의로 만든 개별 객체입니다. 단순 계산 함수로 충분한 문제까지 클래스로 만들기보다 여러 상태와 그 상태를 다루는 규칙이 함께 있을 때 사용합니다.
클래스와 인스턴스의 관계
같은 Expense 클래스에서 점심과 버스라는 별도 인스턴스를 만들 수 있습니다. 각 객체는 자기 이름과 금액을 갖고, 공통으로 정의한 메서드를 사용합니다. self는 메서드를 호출한 인스턴스를 받는 관례적 매개변수 이름입니다.
관련 동작과 지원 조건은 클래스와 인스턴스: 상태와 동작 묶기 관련 공식 문서에서 확인할 수 있습니다.
__init__은 생성된 객체의 초기 상태를 준비하는 초기화 메서드입니다. 호출할 때 self를 직접 넘기지 않습니다. 속성을 어디에 저장하는지 알면 객체별 상태와 공유 상태를 구분하기 쉽습니다.
전체 예제와 실행 결과
별도의 실습 폴더에서 아래 파일을 UTF-8로 저장합니다. 가상환경을 선택한 터미널에서 python classes_demo.py 명령으로 실행합니다. macOS·Ubuntu에서 가상환경을 사용하지 않는 경우 명령 이름을 python3으로 바꿉니다.
classes_demo.py 파일의 전체 내용입니다.
class Expense:
def __init__(self, name, amount):
if amount < 0:
raise ValueError("negative amount")
self.name = name
self.amount = amount
def describe(self):
return f"{self.name}: {self.amount:,} KRW"
first = Expense("lunch", 8000)
second = Expense("bus", 2500)
print(first.describe())
print(second.describe())
print(first.amount + second.amount)
예상 결과는 다음과 같습니다.
lunch: 8,000 KRW bus: 2,500 KRW 10500
객체의 책임을 작게 유지하기
예제는 금액이 음수가 아니어야 한다는 최소 규칙을 초기화 시 확인합니다. 문자열 금액이나 bool을 허용할지는 추가 입력 계약입니다. 초기화 이후 first.amount에 직접 잘못된 값을 넣을 수 있으므로 생성 시 검사만으로 모든 상태 변경을 통제하는 것은 아닙니다.
출력·파일 저장·네트워크 전송까지 Expense 하나에 모두 넣으면 재사용과 테스트가 어려워집니다. 기록 자체의 규칙과 외부 저장 기능을 분리하고 필요한 협력을 인수나 별도 객체로 전달합니다.
독립 상태 확인 실습
- first.amount를 9000으로 바꿔 second.amount는 그대로인지 확인합니다.
- 생성 시 -1을 넣으면 ValueError가 발생하는지 확인합니다.
- Expense.describe(first)와 first.describe()가 같은 결과를 내는 이유를 self와 연결해 설명합니다.
속성 이름 오타는 별도 속성을 만들 수도 있습니다. 데이터 필드를 많이 관리할 때는 dataclass와 타입 힌트, 테스트 등으로 구조를 더 명확히 할 수 있습니다. 객체를 도입한 목적이 코드 길이를 줄이는 것인지 상태 규칙을 표현하는 것인지 돌아보세요.




