ABOUT ME

-

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

     

    마무리

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

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

     

    감사합니다.

Designed by Tistory.