클래스 속성과 정적, 클래스 메서드 사용하기

Tasker_Jang·2026년 2월 26일
post-thumbnail

1. 클래스 속성 vs 인스턴스 속성

클래스 속성__init__ 밖에서 클래스에 바로 선언하는 속성입니다. 클래스에 속해 있으며 모든 인스턴스가 공유합니다. 반면 인스턴스 속성은 인스턴스별로 독립되어 있어 서로 영향을 주지 않습니다.

class Person:
    species = "사람"  # 클래스 속성: 모든 인스턴스가 공유

    def __init__(self, name):
        self.name = name  # 인스턴스 속성: 인스턴스별로 독립

클래스 속성에 접근할 때는 클래스이름.속성명 형태로 접근하면 코드 의도가 더 명확해집니다.

james = Person("james")
maria = Person("maria")

# 클래스 속성: 모든 인스턴스에서 동일한 값
print(Person.species)  # 사람
print(james.species)   # 사람
print(maria.species)   # 사람

# 클래스 속성 변경 → 모든 인스턴스에 반영
Person.species = "인간"
print(james.species)   # 인간
print(maria.species)   # 인간

# 인스턴스 속성: 인스턴스별로 독립
print(james.name)  # james
print(maria.name)  # maria

두 속성의 차이를 표로 정리하면 다음과 같습니다.

구분클래스 속성인스턴스 속성
선언 위치클래스 바로 아래__init__ 안 (self.속성)
공유 여부모든 인스턴스가 공유인스턴스별로 독립
접근 방법클래스명.속성 (권장)인스턴스.속성
비공개 선언__속성명__속성명

클래스 속성도 이름 앞에 밑줄 두 개(__)를 붙이면 비공개 속성으로 만들 수 있습니다.


2. 독스트링(Docstring)

함수와 마찬가지로 클래스와 메서드에도 독스트링(Docstring) 을 작성할 수 있습니다. 클래스나 메서드의 역할을 문서화할 때 사용합니다.

class Person:
    """사람을 표현하는 클래스입니다."""  # 클래스 독스트링

    def greet(self):
        """인사말을 출력하는 메서드입니다."""  # 메서드 독스트링
        print("안녕하세요!")

# help() 또는 __doc__으로 확인 가능
print(Person.__doc__)        # 사람을 표현하는 클래스입니다.
print(Person.greet.__doc__)  # 인사말을 출력하는 메서드입니다.

3. 정적 메서드 — @staticmethod

정적 메서드(Static Method) 는 메서드 위에 @staticmethod 데코레이터를 붙여서 만듭니다. self를 매개변수로 받지 않기 때문에 인스턴스 속성이나 인스턴스 메서드에 접근할 수 없습니다.

💡 메서드 위에 붙는 @로 시작하는 것을 데코레이터(Decorator) 라고 합니다.

class Calculator:
    # 정적 메서드: self 없음, 인스턴스 상태와 무관
    @staticmethod
    def add(a, b):
        return a + b

    @staticmethod
    def is_positive(n):
        return n > 0

# 클래스 또는 인스턴스 모두로 호출 가능
print(Calculator.add(3, 5))       # 8
print(Calculator.is_positive(-1)) # False

calc = Calculator()
print(calc.add(10, 20))  # 30 (인스턴스로도 호출 가능)

정적 메서드는 인스턴스의 상태를 변경하지 않는 유틸리티성 기능을 클래스 안에 묶어두고 싶을 때 사용합니다.


4. 클래스 메서드 — @classmethod

클래스 메서드(Class Method) 는 메서드 위에 @classmethod 데코레이터를 붙이고, 첫 번째 매개변수로 cls(클래스 자기 자신) 를 받습니다. self 대신 cls를 통해 클래스 속성에 접근하거나 클래스 자체를 다룰 수 있습니다.

class Person:
    count = 0  # 클래스 속성: 인스턴스 생성 횟수 추적

    def __init__(self, name):
        self.name = name
        Person.count += 1

    @classmethod
    def get_count(cls):
        print(f"현재까지 생성된 인스턴스: {cls.count}명")

    @classmethod
    def create_anonymous(cls):
        return cls("익명")  # 클래스 메서드로 인스턴스 생성

james = Person("james")
maria = Person("maria")

Person.get_count()  # 현재까지 생성된 인스턴스: 2명

anonymous = Person.create_anonymous()
print(anonymous.name)  # 익명

5. 세 가지 메서드 비교

구분인스턴스 메서드정적 메서드클래스 메서드
데코레이터없음@staticmethod@classmethod
첫 번째 매개변수self없음cls
인스턴스 속성 접근✅ 가능❌ 불가❌ 불가
클래스 속성 접근✅ 가능❌ 불가✅ 가능
주요 사용 목적인스턴스 상태 변경유틸리티 기능클래스 상태 관리, 팩토리 패턴

profile
ML Engineer 🧠 | AI 모델 개발과 최적화 경험을 기록하며 성장하는 개발자 🚀 The light that burns twice as bright burns half as long ✨

0개의 댓글