Programming/Python

[ Python_심화 ] 5. 클래스 활용

Jerrykim91 2020. 6. 27. 01:12
반응형

5. 파이썬 심화 - 클래스 활용


클래스 활용


1. 클래스의 속성

클래스 속성은 클래스에 속해 있다.

그렇기 때문에 클래스의 속성은 모든 인스턴스에서 공유된다.


클래스의 속성 기본 구조

어렵게 생각할 것 없이 클래스에 바로 속성을 만들면 된다.

    class 클래스 이름 :
    
        속성 = 값 
    
    #  주의) __init__  => 인스턴스 속성 ! 

인스턴스 속성 같은 경우는 클래스의 속성과 다르게 인스턴스 별로 독립되어 있고 그렇기 때문에 서로 영향을 주지 않는다.

그럼 확인 해보자!


클래스의 속성일 때

    class Person :
    
        bag = [] 
    
        def putBag(self, stuff):
            self.bag.append(stuff)
            # Person.bag.append(stuff)  # 클래스로 클래스 속성에 접근
    
    Jerry = Person()
    Jerry.putBag('Books')
    # Person.putBag('pen')
    
    Joy = Person()
    Joy.putBag('Wallet')
    
    print(Jerry.bag) # 제리의 가방
    print(Joy.bag)   # 조이의 가방 
    
    # outPut
    # >>> ['Books', 'Wallet']
    # >>> ['Books', 'Wallet']   

인스턴스가 존재할 때

    class Person :
    
        # bag = [] 
        def __init__(self):
            self.bag = []  # 인스턴스 속성 
    
        def putBag(self, stuff):
            self.bag.append(stuff)
    
    Jerry = Person()
    Jerry.putBag('Books')
    
    Joy = Person()
    Joy.putBag('Wallet')
    
    print(Jerry.bag) # 제리의 가방
    print(Joy.bag)   # 조이의 가방 
    
    # outPut
    # >>> ['Books']
    # >>> ['Wallet']   

정리하자면

클래스 속성은

  • 모든 인스턴스가 공유
  • 인스턴스 전체가 사용해야 하는 값을 저장할 때 사용

인스턴스 속성은

  • 인스턴스별로 독립되어 있음
  • 각 인스턴스가 값을 따로 저장해야 할 때 사용


2. 비공개 클래스 속성


비공개 속성은 __속성


비공개 클래스의 속성 기본 구조

어렵게 생각할 것 없이 비공개 클래스에 바로 속성을 만들면 된다.

    class 클래스 이름 :
    
        __속성 = 값  # 비공개 클래스의 속성 -> 외부에서 접근 x 

만약 클래스에서 공개하고 싶지 않은 특정 속성이 있다면 비공개 클래스를 사용하는 것이 좋다.


    class creditCard:
        """
        1만불 한도의 신용카드 
        """
        __money_limit = 10000                   # 비공개 클래스 속성
     
        def  show_money_limit(self):
            print(creditCard.__money_limit)     # 내부 접근
     
     
    amax = creditCard()
    amax.show_money_limit()                     # 1만불
     
    print(creditCard.__money_limit)             # 외부 접근 불가
    
    # outPut
    
    # >>> 10000
    # >>> Traceback (most recent call last):
    #   File "c:/KISS/Python/TestDummy.py", line 19, in <module>
    #     print(creditCard.__money_limit)    # 외부 접근 불가
    # AttributeError: type object 'creditCard' has no attribute '__money_limit'


3. 정적 메서드 **


정적 메서드는 인스턴스를 통하지 않고 클래스에서 바로 호출이 가능하다.

메소드 위에 @staticmethod 를 붙이면 정적 메서드로 사용 가능하다.

그리고 @staticmethod 을 붙인 정적 메서드는 매개변수에 self를 지정하지 않다.

@ 은 메서드(함수)에 추가 기능을 구현할때 쓰는 데코레이터이다.


정적 메소드 기본 구조

    class 클래스이름: 
    
        @staticmethod
        def 메소드(매개변수1, 매개변수2):
            코드 

심플하게 정적 메서드를 활용해 보자!


    class Mall:
        """
        wMart와 eMart 중 어디가 더 저렴할까 ?
        """
    
        @staticmethod
        def wMart(a, b):
            print(f'$ {int((a + b)*0.8)}')
     
        @staticmethod
        def eMart(a, b):
            print(f'$ {a + b}')
    
    apple = 10 
    soup  = 20
    
    Mall.wMart(apple, soup)    
    Mall.eMart(apple, soup)    # 클래스 -> 바로 메소드 호출
    
    # outPut
    
    # >>> $ 24
    # >>> $ 30

정적 메서드는 인스턴스 속성에는 접근할 수 없다.

그래서 인스턴스(속성, 메서드)가 필요없을 경우 사용하는데 인스턴스의 상태를 변화시키지 않는 메소드

즉, 메서드의 실행이 외부 상태에 영향을 끼치지 않는 순수 함수(Pure function)를 만들 때 사용한다.



4. 클래스 메소드 **


정적 메서드와 유사하지만 다른 메서드에 대해 알아보자!

클래스 메서드 = @classmethod

정적 메서드처럼 메소드 위에 @classmethod 을 붙인다.


클래스 메서드 기본 구조

    class 클래스이름:
    
        @classmethod
        def 메소드(cls, 매개변수1, 매개변수2):
            코드

클래스 메소드 출력


클래스 메서드는 메소드 안에서 클래스 속성, 클래스 메서드에 접근할 때 사용하며

정적 메서드처럼 인스턴스 없이 호출할 수 있다.

cls() = Person()

    class Person:
    
        cnt = 0    
     
        def __init__(self):
            Person.cnt += 1    # 명확하게 클래스 속성에 접근을 확인하기 위함
    
     
        @classmethod
        def printCnt(cls):
            print(f'생성 : {cls.cnt}') # cls로 클래스 속성에 접근
     
    
    Jerry = Person()
    Joy   = Person()
     
    Person.printCnt()    
    
    #outPut
    # >>> 생성 : 2 




Reference



Practice makes perfect!