파이썬/클래스와 객체 지향

인스턴스 메소드 vs 클래스 메소드

Data Jun 2025. 3. 20. 11:00

 Python에서 클래스 메소드와 인스턴스 메소드는 어떤 차이가 있을까요? 특히, 클래스 변수와 인스턴스 변수를 다룰 때 어떻게 메소드를 정의해야 할까요?

 

클래스 메소드와 인스턴스 메소드의 차이

class User:
    count = 0

    def __init__(self, name, email, password):
        self.name = name
        self.email = email
        self.password = password

        User.count += 1

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

    def login(self, email, password):
        if self.email == email and self.password == password:
            print("로그인 성공, 환영합니다")
        else:
            print("로그인 실패, 없는 아이디이거나 잘못된 비밀번호입니다.")

    def __str__(self):
        return f"사용자: {self.name}, 이메일: {self.email}"

    @classmethod
    def print_number_of_users(cls):
        print(f"총 유저 수는: {cls.count}입니다")


user1 = User("강영훈", "younghoon@codeit.kr", "123456")
user2 = User("이윤수", "yoonsoo@codeit.kr", "abcdef")
user3 = User("서혜린", "lisa@codeit.kr", "123abc")

# 클래스 메소드 사용
User.print_number_of_users()

클래스 메소드 (@classmethod)

  • cls(클래스)를 첫 번째 인자로 받는다.
  • 클래스 변수를 사용하며, 인스턴스 없이도 호출할 수 있다.
  • User.count 같은 클래스 변수를 다룰 때 사용한다.

인스턴스 메소드

  • self(인스턴스)를 첫 번째 인자로 받는다.
  • 인스턴스 변수(self.name)와 클래스 변수(User.count) 둘 다 사용 가능하다.
  • 반드시 인스턴스를 생성한 후 호출해야 한다.

 

왜 print_number_of_users()는 클래스 메소드여야 할까?

처음에는 이 메소드를 인스턴스 메소드로 작성할 수도 있습니다

def print_number_of_users(self):
    print(f"총 유저 수는: {User.count}입니다")

그러면 user1.print_number_of_users()처럼 호출할 수도 있습니다. 하지만 이 메소드는 인스턴스 변수를 사용하지 않고, 오직 클래스 변수만 참조합니다.

즉, 인스턴스 없이도 동작해야 하는 메소드라면 클래스 메소드로 정의하는 것이 더 적절합니다.

@classmethod
def print_number_of_users(cls):
    print(f"총 유저 수는: {cls.count}입니다")

이제 클래스 자체에서 바로 호출할 수 있습니다.

User.print_number_of_users()  # ✅ 인스턴스 없이 호출 가능

출력:

총 유저 수는: 0입니다

인스턴스가 없어도 호출할 수 있는 메소드는 클래스 메소드로 정의해야 합니다!

 

 

인스턴스 변수와 클래스 변수를 모두 사용할 경우

만약 인스턴스 변수와 클래스 변수를 둘 다 사용해야 한다면, 클래스 메소드가 아닌 인스턴스 메소드로 작성해야 합니다.

def user_info(self):
    print(f"이름: {self.name}, 이메일: {self.email}, 총 유저 수: {User.count}")

이 메소드는 self.name(인스턴스 변수)과 User.count(클래스 변수)를 모두 사용하기 때문에 인스턴스 메소드로 작성해야 합니다.

user1 = User("홍길동", "gildong@example.com", "password123")
user1.user_info()

출력:

이름: 홍길동, 이메일: gildong@example.com, 총 유저 수: 1

 

핵심 정리 

 

클래스 변수를 다룰 때 → @classmethod 사용
인스턴스 변수를 다룰 때 → 인스턴스 메소드 사용
인스턴스 없이도 호출해야 하는 메소드라면 → 클래스 메소드가 적절
인스턴스 변수와 클래스 변수를 함께 사용해야 한다면 → 인스턴스 메소드 사용