Published on

7단계: 클래스와 객체지향

7-1. 클래스 정의

class Person:
    def __init__(self, name):
        self.name = name

    def greet(self):
        print(f"안녕하세요, 저는 {self.name}입니다.")

7-2. 인스턴스 생성과 메서드 호출

p = Person("철수")
p.greet()  # 안녕하세요, 저는 철수입니다.

7-3. self 키워드

  • self는 인스턴스 자신을 가리킴
  • 메서드 정의 시 첫 번째 인자로 반드시 사용

7-4. 클래스 변수 vs 인스턴스 변수

class Dog:
    species = "포유류"  # 클래스 변수

    def __init__(self, name):
        self.name = name  # 인스턴스 변수

7-5. 메서드 오버라이딩

class Parent:
    def say(self):
        print("부모입니다.")

class Child(Parent):
    def say(self):
        print("자식입니다.")

7-6. super() 사용

class A:
    def greet(self):
        print("A 인사")

class B(A):
    def greet(self):
        super().greet()
        print("B 인사")

7-7. 클래스 메서드와 정적 메서드

class MyClass:
    @classmethod
    def cls_method(cls):
        print("클래스 메서드")

    @staticmethod
    def static_method():
        print("정적 메서드")

7-8. str 메서드

class Product:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return f"상품명: {self.name}"

요약

  • 클래스는 속성과 동작을 묶은 코드 구조
  • self는 인스턴스를 지칭하고, 생성자에서 속성 초기화
  • 상속, 오버라이딩, 클래스 메서드 등을 통해 코드 재사용성과 구조화 강화
  • __str__, __init__ 등 특수 메서드로 객체 표현 방식도 제어 가능

심화학습

Q1. 클래스 변수와 인스턴스 변수를 혼용하면 발생할 수 있는 문제는?
A1. 모든 인스턴스가 공유하는 클래스 변수와 개별 속성을 혼동해 예상치 못한 동작이 발생할 수 있습니다.


Q2. super() 호출이 필요한 대표적인 상황은?
A2. 부모 클래스의 생성자나 메서드를 확장하거나 함께 호출하고 싶을 때 super()를 사용합니다.


Q3. 정적 메서드와 클래스 메서드는 언제 사용하나요?
A3. 클래스 상태를 참조해야 하면 클래스 메서드, 완전히 독립적인 유틸리티 함수는 정적 메서드를 사용합니다.