KR_Class - somaz94/python-study GitHub Wiki

Python 클래슀 κ°œλ… 정리


1️⃣ 클래슀 기초

ν΄λž˜μŠ€λŠ” 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ ν…œν”Œλ¦Ώμ΄λ‹€. 데이터와 이λ₯Ό μ²˜λ¦¬ν•˜λŠ” λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ λ¬Άμ–΄ 관리할 수 μžˆλ‹€.

# 기본 클래슀 ꡬ쑰
class Calculator:
    # μƒμ„±μž
    def __init__(self):
        self.result = 0
    
    # λ©”μ„œλ“œ
    def add(self, num):
        self.result += num
        return self.result

βœ… νŠΉμ§•:

  • 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°
  • 데이터와 λ©”μ„œλ“œ μΊ‘μŠν™”
  • μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œ


2️⃣ 객체와 μΈμŠ€ν„΄μŠ€

ν΄λž˜μŠ€λ‘œλΆ€ν„° μƒμ„±λœ μ‹€μ œ 객체λ₯Ό μΈμŠ€ν„΄μŠ€λΌκ³  ν•œλ‹€.

# 객체 생성
calc = Calculator()  # calcλŠ” Calculator의 μΈμŠ€ν„΄μŠ€

# 객체 μ‚¬μš©
calc.add(5)  # λ©”μ„œλ“œ 호좜
print(calc.result)  # 속성 μ ‘κ·Ό

βœ… νŠΉμ§•:

  • 클래슀의 싀체화
  • 독립적인 μƒνƒœ μœ μ§€
  • λ©”μ„œλ“œ μ ‘κ·Ό κ°€λŠ₯


3️⃣ μƒμ„±μžμ™€ μ†Œλ©Έμž

μƒμ„±μžμ™€ μ†Œλ©ΈμžλŠ” 객체의 생λͺ…μ£ΌκΈ°λ₯Ό κ΄€λ¦¬ν•˜λŠ” 특수 λ©”μ„œλ“œμ΄λ‹€.

class Person:
    # μƒμ„±μž
    def __init__(self, name):
        self.name = name
        print(f"{name} 객체가 생성됨")
    
    # μ†Œλ©Έμž
    def __del__(self):
        print(f"{self.name} 객체가 제거됨")

βœ… νŠΉμ§•:

  • 객체 μ΄ˆκΈ°ν™”
  • λ¦¬μ†ŒμŠ€ 정리
  • 생λͺ…μ£ΌκΈ° 관리


4️⃣ 상속

상속은 κΈ°μ‘΄ 클래슀의 속성과 λ©”μ„œλ“œλ₯Ό μƒˆλ‘œμš΄ ν΄λž˜μŠ€κ°€ λ¬Όλ €λ°›λŠ” κΈ°λŠ₯이닀.

# λΆ€λͺ¨ 클래슀
class Animal:
    def __init__(self, name):
        self.name = name
    
    def speak(self):
        pass

# μžμ‹ 클래슀
class Dog(Animal):
    def speak(self):
        return f"{self.name}κ°€ 멍멍!"

# μžμ‹ 클래슀
class Cat(Animal):
    def speak(self):
        return f"{self.name}κ°€ μ•Όμ˜Ή!"

βœ… νŠΉμ§•:

  • μ½”λ“œ μž¬μ‚¬μš©
  • λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©
  • λ‹€ν˜•μ„± κ΅¬ν˜„


5️⃣ μΊ‘μŠν™”

μΊ‘μŠν™”λŠ” 클래슀 λ‚΄λΆ€μ˜ 데이터λ₯Ό λ³΄ν˜Έν•˜κ³  μ™ΈλΆ€μ—μ„œμ˜ 접근을 μ œν•œν•˜λŠ” 기법이닀.

class BankAccount:
    def __init__(self):
        self.__balance = 0  # private λ³€μˆ˜
    
    # getter λ©”μ„œλ“œ
    def get_balance(self):
        return self.__balance
    
    # setter λ©”μ„œλ“œ
    def set_balance(self, amount):
        if amount >= 0:
            self.__balance = amount

βœ… νŠΉμ§•:

  • 데이터 은닉
  • μ ‘κ·Ό μ œμ–΄
  • μ•ˆμ „ν•œ μƒνƒœ 관리


6️⃣ 클래슀 λ©”μ„œλ“œμ™€ 정적 λ©”μ„œλ“œ

클래슀 λ©”μ„œλ“œμ™€ 정적 λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€κ°€ μ•„λ‹Œ 클래슀 λ ˆλ²¨μ—μ„œ λ™μž‘ν•˜λŠ” λ©”μ„œλ“œμ΄λ‹€.

class MyClass:
    count = 0  # 클래슀 λ³€μˆ˜
    
    def __init__(self):
        MyClass.count += 1
    
    @classmethod
    def get_count(cls):  # 클래슀 λ©”μ„œλ“œ
        return cls.count
    
    @staticmethod
    def utility_method():  # 정적 λ©”μ„œλ“œ
        return "μœ ν‹Έλ¦¬ν‹° κΈ°λŠ₯"

βœ… νŠΉμ§•:

  • 클래슀 레벨 κΈ°λŠ₯
  • μΈμŠ€ν„΄μŠ€ 독립적
  • μœ ν‹Έλ¦¬ν‹° κΈ°λŠ₯


7️⃣ λ‹€ν˜•μ„±

λ‹€ν˜•μ„±μ€ λ™μΌν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 λ‹€μ–‘ν•œ ν˜•νƒœμ˜ 객체λ₯Ό μ²˜λ¦¬ν•  수 μžˆλŠ” λŠ₯λ ₯이닀.

def animal_speak(animal):
    # 동물 객체가 μ–΄λ–€ νƒ€μž…μ΄λ“  speak λ©”μ„œλ“œλ₯Ό 호좜
    print(animal.speak())

# λ‹€μ–‘ν•œ 객체둜 λ™μΌν•œ ν•¨μˆ˜ 호좜
dog = Dog("바둑이")
cat = Cat("λ‚˜λΉ„")

animal_speak(dog)  # 바둑이가 멍멍!
animal_speak(cat)  # λ‚˜λΉ„κ°€ μ•Όμ˜Ή!

βœ… νŠΉμ§•:

  • μ½”λ“œ μœ μ—°μ„±
  • μΈν„°νŽ˜μ΄μŠ€ 기반 ν”„λ‘œκ·Έλž˜λ°
  • ν™•μž₯μ„± 증가


8️⃣ 속성 μ ‘κ·Όμž λ©”μ„œλ“œ

νŒŒμ΄μ¬μ—μ„œλŠ” 속성 접근을 μ»€μŠ€ν„°λ§ˆμ΄μ¦ˆν•˜λŠ” μ—¬λŸ¬ 방법을 μ œκ³΅ν•œλ‹€.

class Person:
    def __init__(self):
        self._age = 0
    
    # property λ°μ½”λ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•œ getter
    @property
    def age(self):
        return self._age
    
    # setter λ©”μ„œλ“œ
    @age.setter
    def age(self, value):
        if value >= 0:
            self._age = value
    
    # deleter λ©”μ„œλ“œ
    @age.deleter
    def age(self):
        del self._age
        print("age 속성이 μ‚­μ œλ¨")

# μ‚¬μš© μ˜ˆμ‹œ
person = Person()
person.age = 25  # setter 호좜
print(person.age)  # getter 호좜
del person.age  # deleter 호좜

βœ… νŠΉμ§•:

  • 속성 μ ‘κ·Ό μ œμ–΄
  • κ³„μ‚°λœ 속성 κ΅¬ν˜„
  • μ ‘κ·Ό 둜직 μΊ‘μŠν™”


9️⃣ 맀직 λ©”μ„œλ“œ

맀직 λ©”μ„œλ“œλŠ” 이름 μ•žλ’€μ— 이쀑 밑쀄(__)이 μžˆλŠ” 특수 λ©”μ„œλ“œλ‘œ, 파이썬의 λ‚΄μž₯ μ—°μ‚°μžλ‚˜ ν•¨μˆ˜μ™€ μ—°κ²°λœλ‹€.

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    # 벑터 λ§μ…ˆ μ—°μ‚°μž (+)
    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)
    
    # λ¬Έμžμ—΄ ν‘œν˜„
    def __str__(self):
        return f"Vector({self.x}, {self.y})"
    
    # 객체 ν‘œν˜„
    def __repr__(self):
        return f"Vector({self.x}, {self.y})"
    
    # 길이(크기) 계산
    def __len__(self):
        return int((self.x**2 + self.y**2)**0.5)
    
    # 비ꡐ μ—°μ‚°μž (==)
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

# μ‚¬μš© μ˜ˆμ‹œ
v1 = Vector(2, 3)
v2 = Vector(3, 4)
v3 = v1 + v2  # __add__ 호좜
print(v3)  # __str__ 호좜
print(len(v3))  # __len__ 호좜
print(v1 == v2)  # __eq__ 호좜

βœ… μ£Όμš” 맀직 λ©”μ„œλ“œ:

  • __init__: 객체 μ΄ˆκΈ°ν™”
  • __str__, __repr__: λ¬Έμžμ—΄ ν‘œν˜„
  • __add__, __sub__, __mul__: μ—°μ‚°μž μ˜€λ²„λ‘œλ”©
  • __len__, __getitem__, __setitem__: μ‹œν€€μŠ€/λ§€ν•‘ λ™μž‘
  • __enter__, __exit__: μ»¨ν…μŠ€νŠΈ κ΄€λ¦¬μž
  • __call__: 호좜 κ°€λŠ₯ 객체


1️⃣0️⃣ 닀쀑 상속과 믹슀인

νŒŒμ΄μ¬μ€ μ—¬λŸ¬ 클래슀λ₯Ό 상속받을 수 μžˆλŠ” 닀쀑 상속을 μ§€μ›ν•œλ‹€.

# 기본 클래슀
class Animal:
    def speak(self):
        pass

# 믹슀인 ν΄λž˜μŠ€λ“€
class SwimMixin:
    def swim(self):
        return "수영 쀑"

class FlyMixin:
    def fly(self):
        return "λΉ„ν–‰ 쀑"

# 닀쀑 상속
class Duck(Animal, SwimMixin, FlyMixin):
    def speak(self):
        return "κ½₯κ½₯"

# μ‚¬μš© μ˜ˆμ‹œ
duck = Duck()
print(duck.speak())  # κ½₯κ½₯
print(duck.swim())   # 수영 쀑
print(duck.fly())    # λΉ„ν–‰ 쀑

βœ… νŠΉμ§•:

  • μ—¬λŸ¬ 클래슀의 κΈ°λŠ₯ μ‘°ν•©
  • 믹슀인 νŒ¨ν„΄μœΌλ‘œ μ½”λ“œ μž¬μ‚¬μš©
  • 닀이아λͺ¬λ“œ λ¬Έμ œμ™€ MRO(Method Resolution Order)


μ£Όμš” 팁

βœ… λͺ¨λ²” 사둀:

  • 클래슀λͺ…은 파슀칼 μΌ€μ΄μŠ€(PascalCase) μ‚¬μš©
  • μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ˜ 첫 λ§€κ°œλ³€μˆ˜λŠ” 항상 self
  • private 속성은 이름 μ•žμ— __ μΆ”κ°€
  • 상속보닀 μ»΄ν¬μ§€μ…˜ μ„ ν˜Έ
  • 속성 μ ‘κ·Όμ—λŠ” ν”„λ‘œνΌν‹° μ‚¬μš©
  • 맀직 λ©”μ„œλ“œλ‘œ 파이썬의 κ·œμ•½ ν™œμš©
  • 닀쀑 상속은 μ‹ μ€‘ν•˜κ²Œ μ‚¬μš©
  • λ―ΉμŠ€μΈμ€ ν•œ κ°€μ§€ κΈ°λŠ₯에 집쀑
  • docstring으둜 ν΄λž˜μŠ€μ™€ λ©”μ„œλ“œ λ¬Έμ„œν™”
  • λΆˆλ³€ κ°μ²΄λŠ” __hash__와 __eq__ κ΅¬ν˜„


⚠️ **GitHub.com Fallback** ⚠️