한양과학기술고등학교

에듀테크 프로젝트 대시보드

클래스 기초

class __init__ self instance

class 로 새 타입을 정의합니다. self 는 인스턴스 자신을 가리키는 첫 매개변수입니다.

1. 정의와 인스턴스화

class Dog:
    def __init__(self, name, age):   # 생성자 (초기화)
        self.name = name             # 인스턴스 속성
        self.age = age

    def bark(self):
        return f"{self.name}: 멍!"

d = Dog("바둑이", 3)                  # __init__ 자동 호출
d.name          # => '바둑이'
d.bark()        # => 바둑이: 멍!

2. 클래스 변수 vs 인스턴스 변수

class Dog:
    species = "Canis familiaris"     # 클래스 변수 — 모든 인스턴스 공유

    def __init__(self, name):
        self.name = name             # 인스턴스마다 별도

Dog.species                          # 클래스에서 접근
d1 = Dog("A"); d2 = Dog("B")
d1.species                           # => 'Canis familiaris' (클래스 것 참조)
d1.species = "특별"                  # d1 에만 새 인스턴스 속성 생성
d2.species                           # 여전히 원래 값
가변 클래스 변수 함정
  • class C: items = [] → 모든 인스턴스가 같은 리스트 공유
  • 인스턴스별 데이터는 반드시 __init__ 안에서 self.items = []

3. 메서드와 self

class Counter:
    def __init__(self):
        self.count = 0

    def increment(self, step=1):
        self.count += step
        return self                  # 메서드 체이닝 가능하게

c = Counter()
c.increment().increment(5)
c.count          # => 6

# c.increment() 는 Counter.increment(c) 로 변환됨

4. 문자열 표현

class Point:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __repr__(self):              # 개발자용 (디버깅, 리스트 출력)
        return f"Point({self.x}, {self.y})"

    def __str__(self):               # 사용자용 (print)
        return f"({self.x}, {self.y})"

p = Point(1, 2)
print(p)         # => (1, 2)
p                # => Point(1, 2)
[p, p]           # => [Point(1, 2), Point(1, 2)]

5. 캡슐화 관례

class Account:
    def __init__(self, balance):
        self.owner = "공개"          # public
        self._balance = balance      # 관례상 내부용 (강제 아님)
        self.__pin = "1234"          # 이름 맹글링 → _Account__pin

a = Account(100)
a._balance       # 접근은 되지만 "쓰지 마세요" 신호
# a.__pin        # AttributeError (사실은 a._Account__pin 으로 존재)

6. 클래스도 객체

type(Dog)              # => <class 'type'>
Dog.__name__          # => 'Dog'
d = Dog("A")
d.__class__           # => <class 'Dog'>
isinstance(d, Dog)    # => True

# 동적으로 속성 추가 (권장은 아님)
d.tricks = ["구르기"]
hasattr(d, "tricks")  # => True
getattr(d, "age", 0)  # 없으면 기본값
"단순함이 복잡함보다 낫다 (Simple is better than complex)"