-
Python | Class에 대해서python 2022. 1. 23. 21:54
파이썬을 다시 공부하게 되면서 Class부터 정리를 해보려고 합니다.
Class
# 강아지를 생성하는 클래스입니다. class Dog: def __init__(self, kind, name, age): self._kind = kind self._name = name self._age = age
간단한 예시로 클래스는 위와 같이 생성할 수 있습니다.
각각을 좀 더 정리를 해보도록 하겠습니다.
__init__
__init__ 메서드는 인스턴스가 생성될 때 실행되는 메서드로 Instance 변수를 지정합니다.
(Java의 생성자 정도로 생각하시면 됩니다.)
Instance 변수
Instance 변수는 간단히 Instance에 대한 속성 값이라고 생각하면 됩니다.
def __init__(self, kind, name, age): self._kind = kind self._name = name self._age = age
위와 같이 클래스를 작성했다면 해당 클래스로부터 생성된 인스턴스에는 _kind, _name, _age라는 속성(인스턴스 변수)이 존재합니다.
이름 앞에 _를 붙인 이유는 class변수와 차별화하기 위함입니다. _를 붙이지 않아도 상관없습니다.
인스턴스 생성
# 인스턴스 생성 dog1 = dog('maltese', 'max', 8) dog2 = dog('husky', 'bob', 5) print(dog1.__dict__) # {'_kind': 'maltese', '_name': 'max', '_age': 8} print(dog2.__dict__) # {'_kind': 'husky', '_name': 'bob', '_age': 5}
위와 같이 각각 생성된 dog1, dog2객체에는 각각 다른 값을 가지고 있는 것을 확인할 수 있습니다.
Class 변수
Class 변수는 클래스로부터 생성된 인스턴스들이 공유하는 변수입니다.
class Dog: managed_count = 0 def __init__(self, kind, name, age) -> None: self._kind = kind self._name = name self._age = age # Class로 부터 인스턴스를 생성하면 count를 1 올립니다. Dog.managed_count += 1
생성된 강아지수를 관리하기 위해 managed_count라는 클래스 변수를 이용하여 관리하도록 합니다.
dog1 = Dog('maltese', 'max', 8) dog2 = Dog('husky', 'bob', 5) print(Dog.managed_count) # 2 print(dog1.managed_count) # 2 print(dog2.managed_count) # 2
위의 예시처럼 각각의 인스턴스들은 클래스 변수를 공유하는 것을 확인할 수 있습니다.
여기까지 강아지를 생성하는 Class를 만드는 예제를 다루어보았습니다.
이제 클래스로부터 만들어진 인스턴스(dog1, dog2...)에 기능을 추가하는 방법을 정리하도록 하겠습니다.
Method
Class에는 Method를 이용하여 생성된 인스턴스(강아지)에 기능을 추가할 수 있습니다.
Method는 3가지 종류가 있어 각각 예시를 통해 설명하도록 하겠습니다.
Instance Method
인스턴스 메서드는 기본적으로 클래스에서 만들어주는 메서드라고 생각하면 됩니다.
강아지에게 짖을 수 있는 기능을 추가하려면 다음과 같이 인스턴스 메서드를 추가해주면 됩니다.
class Dog: def __init__(self, kind, name, age): self._kind = kind self._name = name self._age = age def bark(self): print(f'{self._name} 멍멍')
강아지에게 짖을 수 있는 기능을 추가하려면 다음과 같이 인스턴스 메서드를 추가해주면 됩니다.
인스턴스 메서드에는 첫 번째 인자로 self를 받도록 해야 합니다.
인스턴스 메서드는 클래스로부터 인스턴스를 생성한 후에 생성된 인스턴스로부터 사용될 수 있습니다.
dog1 = Dog('maltese', 'max', 8) dog2 = Dog('husky', 'bob', 5) dog1.bark() # max 멍멍 dog2.bark() # bob 멍멍
위와 같이 bark라는 메서드를 실행하여 강아지가 짖을 수 있게 할 수 있습니다.
Class Method
클래스 메서드는 인스턴스를 생성하지 않아도 사용할 수 있는 메서드입니다.
class Dog: managed_count = 0 def __init__(self, kind, name, age): self._kind = kind self._name = name self._age = age Dog.managed_count += 1 def bark(self): print(f'{self._name} 멍멍') @classmethod def get_managed_count(cls): print(cls) # <class '__main__.Dog'> print(f'총 강아지 수 : {cls.managed_count}')
클래스 메서드를 생성하려면 메서 드위에 @classmethod를 입력받아야 하고 첫 번째 인자로 cls를 반드시 받도록 되어야 합니다.
(cls는 해당 클래스라고 생각하시면 됩니다. print를 해보면 Dog Class가 조회되는 걸 확인할 수 있습니다.)
Dog.get_managed_count() # 2 dog1 = Dog('maltese', 'max', 8) dog2 = Dog('husky', 'bob', 5) dog1.get_managed_count() # 2 dog2.get_managed_count() # 2
사용은 클래스 자체에서 바로 사용할 수 있고, 추가로 생성된 인스턴스에서도 사용할 수 있습니다.
Static Method
스태틱 메서드는 클래스 메서드와 비슷하지만 지정된 인자(self, cls)를 받지 않아도 된다는 차이점이 있습니다.
class Dog: managed_count = 0 def __init__(self, kind, name, age): self._kind = kind self._name = name self._age = age Dog.managed_count += 1 def bark(self): print(f'{self._name} 멍멍') @staticmethod def is_husky(inst): if inst._kind == "husky": return True else: return False
스태틱 메서드를 생성하려면 @staticmethod를 메서드 위에 작성해야 합니다.
현재는 Dog 클래스로부터 만들어진 강아지(인스턴스)의 종류를 비교하는 메서드를 생성하였습니다.
dog1 = Dog('maltese', 'max', 8) dog2 = Dog('husky', 'bob', 5) print(Dog.is_husky(dog1)) # False print(Dog.is_husky(dog2)) # True
스태틱 메서드 또한 클래스에서 직접 사용할 수 있고 각각 생성된 인스턴스에서도 사용할 수 있습니다.
self
클래스에 인스턴스 메서드를 생성하면서 가장 첫 번째 인자로 self라는 게 있는 것을 확인할 수 있었습니다.
결론적으로 self는 인스턴스 자체를 나타냅니다.
인스턴스 자체라는 것을 확인하기 위해서 간단한 메서드를 만들어보겠습니다.
class Dog: managed_count = 0 def __init__(self, kind, name, age): self._kind = kind self._name = name self._age = age Dog.managed_count += 1 def get_inst_id(self): ''' get instance id''' return id(self)
클래스로부터 각각의 인스턴스들을 생성하고 확인을 해보도록 하겠습니다.
dog1 = Dog('maltese', 'max', 8) dog2 = Dog('husky', 'bob', 5) print(id.__doc__) # id라는 메서드는 객체의 id를 반환하는 메서드입니다. print(id(dog1) == dog1.get_inst_id()) # True print(id(dog2) == dog2.get_inst_id()) # True
id메서드로 각각의 객체와 self를 조회해보면 동일한 id가 나오는 것을 확인할 수 있습니다.
따라서 self의 의미는 클래스로부터 만들어진 인스턴스 자체라는 것을 확인할 수 있습니다.
마무리
파이썬을 다시 공부하게 되면서 공부한 내용들을 계속해서 정리해 나가려고 합니다.
잘못 정리한 부분이 있거나 추가적인 설명이 필요한 부분이 있다면 댓글 남겨주시면 저에게 많은 도움이 될 것 같습니다.
감사합니다.
'python' 카테고리의 다른 글
Python | Python 데코레이터(Decorator) (0) 2022.01.26 Python | Python 일급 함수(First Class function) (0) 2022.01.26 Python | Python 내부 동작과정 (0) 2022.01.24