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 사용
✔ 인스턴스 변수를 다룰 때 → 인스턴스 메소드 사용
✔ 인스턴스 없이도 호출해야 하는 메소드라면 → 클래스 메소드가 적절
✔ 인스턴스 변수와 클래스 변수를 함께 사용해야 한다면 → 인스턴스 메소드 사용
'파이썬 > 클래스와 객체 지향' 카테고리의 다른 글
🧐 스페셜 메소드(Special Method)란? (0) | 2025.03.20 |
---|---|
파이썬은 순수 객체 지향 언어! 🐍✨ (0) | 2025.03.20 |
[객체 지향 프로그래밍 4개의 기둥] 추상화를 통해 다형성을 구현하는 방법 (0) | 2025.03.18 |
[객체 지향 프로그래밍 4개의 기둥] 다형성 (0) | 2025.03.18 |
[객체 지향 프로그래밍 4개의 기둥] 캡슐화 그리고 프라이빗 메서드와 은닉화 (0) | 2025.03.18 |