Python | Class에 대해서
파이썬을 다시 공부하게 되면서 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의 의미는 클래스로부터 만들어진 인스턴스 자체라는 것을 확인할 수 있습니다.
마무리
파이썬을 다시 공부하게 되면서 공부한 내용들을 계속해서 정리해 나가려고 합니다.
잘못 정리한 부분이 있거나 추가적인 설명이 필요한 부분이 있다면 댓글 남겨주시면 저에게 많은 도움이 될 것 같습니다.
감사합니다.