C.W.K.
Stream
Lesson 01 of 07 · published

클래스 정의 — class / __init__ / self

~22 min · class, init, self, instance

Level 0호기심
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete

class 문

class 문이 클래스 객체 만들고 (Python 의 모든 거처럼 자체가 값) 이름에 바인딩. 본문 안에 메서드 (self 첫 인자로 받는 함수) 와 클래스 레벨 속성 정의. 클래스 호출 (Circle(3)) 하면 인스턴스 생성.

__init__ — 생성자가 아니라 후처리 setup

__init__ 은 엄밀히 말하면 생성자가 아니야. 진짜 생성자는 __new__ — 빈 인스턴스 생성. __init__ 은 그 직후 도는 setup hook — 새 인스턴스의 속성 채움. __new__ override 는 특수 경우 (싱글톤, immutable 서브클래스) 만 — 99% 는 __init__.

self — 관습상 인스턴스

모든 인스턴스 메서드의 첫 인자가 self. obj.method(...) 호출하면 Python 이 인스턴스 자동으로 넘김. self 라는 이름은 키워드 X — 다른 이름 가능 — 근데 모든 Python 개발자가 self 기대. 다른 이름 쓰면 다음 독자가 멈춰서 찡그려. 싸우지 마.

메서드 호출 — bound vs unbound

obj.method 접근하면 Python 이 *bound 메서드* 반환 — 인스턴스에 이미 연결된 호출 가능. obj.method(x) 가 작동하는 건 self 가 자동 채워지기 때문. Circle.area(c) 직접 호출도 작동 — unbound (정확히는 클래스의 함수) 형태, 인스턴스 명시적으로 넘김. bound 형태가 일상 작성용.

원칙: 클래스 = 청사진, 인스턴스 = 거기서 만든 거. 클래스 레벨 state 는 클래스 자체에, 인스턴스 레벨 state 는 각 인스턴스에. 둘 헷갈리면 "왜 list 가 인스턴스 간에 계속 자라" 부류 버그 — 다음 lesson 에서.

Code

최소 클래스·python
class Circle:
    def __init__(self, radius):
        self.radius = radius            # 인스턴스에 속성

    def area(self):
        return 3.14159 * self.radius ** 2

c = Circle(5)
print(c.radius)         # 5
print(c.area())         # 78.54

# self 는 인스턴스 — Python 이 자동 채움
print(Circle.area(c))   # 78.54  (클래스에서 호출, 인스턴스 명시)
__init__ vs __new__·python
class Logger:
    def __new__(cls, *args, **kwargs):
        print("__new__: 인스턴스 생성")
        instance = super().__new__(cls)     # 실제 생성
        return instance

    def __init__(self, name):
        print("__init__: setup")
        self.name = name

l = Logger("main")
# __new__: 인스턴스 생성
# __init__: setup

# 99% 는 __init__ 만 override
여러 인스턴스 — 각자 자기 state·python
class Account:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.balance = balance

    def deposit(self, amount):
        self.balance += amount
        return self.balance

a = Account("alice")
b = Account("bob", 100)

a.deposit(50)
b.deposit(25)

print(a.owner, a.balance)        # alice 50
print(b.owner, b.balance)        # bob 125    — 독립 state
Bound 메서드 — 마법 풀이·python
class Greeter:
    def __init__(self, name):
        self.name = name

    def hi(self):
        return f"hello {self.name}"

g = Greeter("pippa")

# obj.method 가 BOUND 메서드 — 인스턴스 기억
bound = g.hi
print(bound)                # <bound method Greeter.hi of <__main__.Greeter object at ...>>
print(bound())              # 'hello pippa'

# 그냥 Greeter.hi 는 클래스의 함수일 뿐
print(Greeter.hi(g))        # 'hello pippa' — 인스턴스 명시적으로

External links

Exercise

클래스 BankAccount 정의 — __init__(self, owner, opening_balance=0). 메서드 셋 — deposit(amount), withdraw(amount) (0 미만이면 ValueError), transfer_to(other_account, amount) (적절히 withdraw + deposit 사용). 두 계좌 만들고 송금 후 잔액 출력 테스트. 잔액 부족 송금도 시도해서 예외 발생 확인.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.