Python에서 클래스 내의 메서드는 인스턴스 메서드, 클래스 메서드, 정적 메서드로 분류할 수 있습니다. 각각은 고유한 목적을 갖고 클래스와 해당 인스턴스에 대한 다양한 수준의 액세스를 제공합니다. 이 블로그에서는 클래스 메서드와 정적 메서드, 사용 방법, 접할 수 있는 일반적인 인터뷰 질문을 살펴보겠습니다.
클래스 메서드와 정적 메서드를 살펴보기 전에 인스턴스 메서드를 간략하게 요약해 보겠습니다.
class Car: def __init__(self, model, year): self.model = model self.year = year def display_info(self): print(f"Car Model: {self.model}, Year: {self.year}") # Usage my_car = Car("Toyota", 2020) my_car.display_info() # Output: Car Model: Toyota, Year: 2020
클래스 메서드는 클래스 인스턴스뿐만 아니라 클래스 자체에 액세스할 수 있는 메서드입니다. 클래스를 나타내는 첫 번째 매개변수로 cls를 사용합니다. @classmethod 데코레이터를 사용하여 정의됩니다.
대체 생성자를 생성합니다.
클래스 수준 속성에 액세스하거나 수정합니다.
class Person: def __init__(self, name, age): self.name = name self.age = age @classmethod def from_birth_year(cls, name, birth_year): current_year = 2024 age = current_year - birth_year return cls(name, age) # Usage person1 = Person("Alice", 30) # Using the primary constructor person2 = Person.from_birth_year("Bob", 1990) # Using the alternative constructor print(person1.name, person1.age) # Output: Alice 30 print(person2.name, person2.age) # Output: Bob 34
이 예에서 from_birth_year는 태어난 연도부터 나이를 계산하고 Person 인스턴스를 생성하는 대체 생성자입니다.
class Employee: company_name = "TechCorp" def __init__(self, name): self.name = name @classmethod def change_company(cls, new_name): cls.company_name = new_name # Usage Employee.change_company("NewTechCorp") print(Employee.company_name) # Output: NewTechCorp
이 예에서change_company는 company_name 클래스 속성을 변경하는 클래스 메소드입니다.
정적 메서드는 클래스 또는 인스턴스별 데이터에 액세스하거나 수정하지 않습니다. 이는 클래스에 속하고 @staticmethod 데코레이터를 사용하여 정의되는 유틸리티 메서드입니다.
클래스 및 인스턴스 데이터와 독립적으로 작동하는 유틸리티 함수를 정의합니다.
클래스 네임스페이스 내에서 코드를 체계적으로 유지합니다.
class MathUtils: @staticmethod def add(a, b): return a b # Usage print(MathUtils.add(5, 7)) # Output: 12
이 예에서 add는 클래스나 인스턴스 데이터와 독립적으로 추가를 수행하는 정적 메서드입니다.
인스턴스 메서드: 클래스의 인스턴스(자체)에서 작동합니다.
클래스 메서드: 클래스 자체에 대해 작업합니다(cls).
정적 메서드: 클래스 또는 인스턴스별 데이터에 대해 작동하지 않습니다.
클래스 메서드: cls를 첫 번째 매개변수로 사용하여 클래스 자체에서 작동합니다. 클래스 수준 데이터를 수정할 수 있습니다.
정적 메서드: 클래스 및 인스턴스별 데이터와 독립적입니다. cls 또는 self를 첫 번째 매개변수로 사용하지 않습니다.
class Book: def __init__(self, title, author, publication_year): self.title = title self.author = author self.publication_year = publication_year @classmethod def from_string(cls, book_str): title, author, publication_year = book_str.split(', ') return cls(title, author, int(publication_year)) @staticmethod def is_valid_year(year): return year > 0 # Usage book1 = Book("Python Basics", "John Doe", 2020) book2 = Book.from_string("Advanced Python, Jane Smith, 2018") print(book1.title, book1.author, book1.publication_year) # Output: Python Basics John Doe 2020 print(book2.title, book2.author, book2.publication_year) # Output: Advanced Python Jane Smith 2018 print(Book.is_valid_year(2024)) # Output: True
이 예에서 from_string은 문자열에서 Book 객체를 생성하는 대체 생성자(클래스 메서드)이고, is_valid_year는 연도가 유효한지 확인하는 정적 메서드입니다.
대체 생성자로서의 클래스 메서드는 다양한 종류의 입력 또는 시나리오에서 인스턴스를 생성하는 유연성을 제공하여 코드를 더 읽기 쉽게 만들고 객체 생성 논리를 위한 단일 위치를 유지합니다.
인스턴스 메서드: 클래스 인스턴스에서 작동하고 인스턴스별 데이터를 수정할 수 있습니다.
클래스 메서드: cls를 첫 번째 매개변수로 사용하여 클래스 자체에 대해 작동하고 클래스 수준 데이터를 수정할 수 있습니다.
정적 메서드: 클래스 또는 인스턴스별 데이터에 대해 작동하지 않으며 유틸리티 기능에 사용됩니다.
이러한 방법을 효과적으로 이해하고 활용하면 Python에서 보다 체계적이고 유연한 객체지향 코드를 작성할 수 있습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3