python

Python | Class에 대해서

no-easy-ray 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의 의미는 클래스로부터 만들어진 인스턴스 자체라는 것을 확인할 수 있습니다.

 

마무리

파이썬을 다시 공부하게 되면서 공부한 내용들을 계속해서 정리해 나가려고 합니다.

잘못 정리한 부분이 있거나 추가적인 설명이 필요한 부분이 있다면 댓글 남겨주시면 저에게 많은 도움이 될 것 같습니다.

 

감사합니다.