목차

    클래스

    기본개념

    • 객체를 표현하기 위한 문법
    • 클래스가 무엇이냐 하면 필자가 공부를 할 때는 항상 붕어빵 기계를 비유하면서 설명을 들었습니다. 적절한 표현이라고 생각합니다.
      위 말은 즉 **객체 ( 붕어빵 )** 을 동일하게 만들기 위해 **붕어빵 기계 ( 클래스 )** 가 필요하다는 것을 보여주고 싶었던 것 같네요.
      이것을 제 말로 바꿔보면 객체 ( 붕어빵 ) 을 편하게 제작 및 변경( 팥 붕어빵, 슈크림 붕어빵. 등)하기 위해 붕어빵 기계가 있어야 한다는 것을 표현한 것 같네요.
      • 생성한 객체에 어떤 변형된 값을 넣느냐에 따라 값이 변하고, 동일한 것도 편하게 만들 수 있단, 뜻입니다.

    클래스 및 메소드 만들기

    • 클래스 또한 다른 메소드 만드는 방법과 동일하게 : 을 마지막에 붙여줍니다.
    • 메소드의 인자 값의 첫 번째 값은 반드시 self가 들어와야 합니다.
    • 객체 사용은. 을 통하여 사용합니다.
      • 평상시에 자주 쓰는 int(), len(), list() , 등 이것들도 클래스 메소드입니다.

    객체 생성 / 사용

    • 클래스는 여러 번 재사용 가능합니다.
      • 아래와 같은 방식으로 같은 클래스를 여러 인스턴스로 사용할 수 있수 있습니다.
      • 인스턴스1 = 클래스() 인스턴스2 = 클래스() 인스턴스1.메소드( 인자 값 ) 인스턴스2.메소드( 인자값 )

    속성 값 생성

    • **init(self)를 선언하고, 안에 속성 값을 넣어줍니다.
    • self의 의미는 Java 등의 this와 유사( 개인적인 생각엔 동일한 개념 )
    • JAVA의 생성자( 객체 생성 시 초기값을 삽입해주는 느낌 )처럼 사용 가능합니다.
    • 속성 접근 시 self.속성명 혹은 "클래스명. 속성명"을 이용하여 사용합니다.
      • self 혹은 클래스명 중 하나로 접근하면 되는데, 클래스명으로 하면 조금 더 가동성이 높아진다.
    class 클래스 이름:
        self.속성1
        def __init__(self, 매개변수1,매개변수2):
            self.속성2 = 매개변수1
            self.속성3 = 매개변수2    
    • 비공개 속성 (private attribute )
      • 속성 앞에 __ (언더바 2개 )를 삽입해준다.
      • 클래스 외부에서 접근할 수 없다.
      • 비공개 속성을 제어하려면, 클래스 내부에서 제어해야 한다.
        • 클래스 내부의 메소드를 이용하여 호출해서 사용하면 된다
    class 클래스 이름:
        def __init__(self, 매개변수1,매개변수2):
            self.__속성1 = 매개변수1
            self.__속성2 = 매개변수2    

    매개변수 위치 인수 ( 리스트 등 )로 받기

    • 언패킹을 이용하면 된다.
      • 1차원이면, '*' 를사용하고, 2차원이면 '**'를 사용한다
    class 클래스 이름:
        def __init__(self, *argv):
            self.속성1 = argv[0]
            self.속성2 = argv[2]
    class 클래스 이름:
        def __init__(self, **argD):
            self.속성1 = argvD[ key1 ]
            self.속성2 = argvD[ key2 ]

    객체 포함 확인( 클래스의 인스턴스 여부 판단)

    • 반환 값 : True ( 포함됨 ) , False (포함 안됨)
    isinstance ( 인스턴스 , 클래스 )

    정적 메소드 생성

    • 인스턴스를 사용하지 않고 바로 사용할 수 있는 메소드
      • len() , range()...처럼 한 번에 사용할 수 있는 메소드들
    • 정적메소드 앞에 @staticmethod를 붙여준다
      • @를 붙여서 하는것을 데코레이터라고 부른다 ( 추후 공부하면 따로올리겠습니다.)
    • 정적 메소드는 인자값이 self가 아님으로 인스턴스 속성에 접근할 수 없다.
      • 인스턴스 속성에 접근할 필요가 없을때 주로 사용한다.
    class 클래스이름:
        @staticmethod
        def 메소드 ( 매개변수1, 매개변수2 ):
            코드

    클래스 메소드 사용

    • 정적 메소드와 유사함
      • 인스턴스 없이 호출할 수 있다.
    • 정적 메소드와 차이점
      • 클래스의 속성 & 메소드에 접근 할 수 있다.
    clas 클래스이름:
        @classmethod
        def 메소드(cls,매개변수1, 매개변수2):
            코드

    클래스 상속

    기본개념

    • 생성된 클래스를 재생성하는 것.
      • 부모 클래스의 메소드 등을 상속받아 기능을 더 붙인 자식 클래스를 생성합니다.
    • 필자는 '상속'을 배울 때 주로 비유했던 것이 '새'를 이용하여 한 것이 많았습니다. 간단히 말하자면 부모 클래스에 ''라는 것을 선언합니다. 그 후 자식 클래스에서 상속을 받고, 새로운 기능인 '날 수 있다'라는 기능을 추가합니다. 그러면 자식 클래스에는 ''라는 것은 선언되어있지 않지만, 상속받았기 때문에 그 기능을 사용할 수 있습니다.
    • 글로 적으니 어려운 느낌이지만, 부모 클래스에 적혀있는 모든 코드들 자식 클래스에 저희 눈에는 없지만, 적어졌다 라고 생각해도 될 것 같습니다. ( 실제로는 그런 느낌이지만 그건 아닙니다.)
    • 용어
      • 기반 클래스 ( 상속을 해주는 클래스 ) : 부모 클래스 , 슈퍼클래스
      • 파생 클래스 ( 상속을 받는 클래스 ) : 자식 클래스 , 서브클래스

    상속 구현

    • 클래스 선언 시 인자 값으로 기반 클래스를 삽입하여 사용한다.
    • 만약 파생 클래스에서 '__init__'을 선언했다면, super().__init__()을 한 번은 호출해주는 것을 권장한다.
      • 만약 파생 클래스에서 '__init__'을 선언하지 않았다면, 자동으로 기반 클래스의 '__init__'이 호출된다.
        class 기반클래스 : 
            def __init(self):
                코드
    
        clss 파생클래스 (기반클래스명):
            def __init(self):
                  super().__init__()
                코드    
    
        clss 파생클래스2 (기반클래스명):
            코드
    
    • 만약 위와 같이 구현하지 않고, 명확하게 구현하고 싶다면, 아래와 같이 적어주면 된다.
      • super()에 인자 값으로 (부모 클래스, self)를 삽입시켜준다.
        • 위와 같이 한다면, 명확히 부모 클래스로 연결된다.
        class 기반클래스 : 
            def __init(self):
                코드
    
        clss 파생클래스 (기반클래스명):
            def __init(self):
                  super(기반클래스, self).__init__()
                코드    
    
        clss 파생클래스2 (기반클래스명):
            코드

    메소드 오버라이딩(재정의)

    • 기반 클래스( 부모 클래스 )에서 구현한 메소드를 파생 클래스( 자식 클래스 )에서 재정의 하는 것
      • 메소드 명은 동일한데, 안의 구현 내용을 변경하고 싶을 때 사용한다.
    • 아래와 같이 동일한 메소드명 및 동일한 인자수를 넣어 구현하면 된다.
    • 오버라이딩을 하더라도, super()을 이용한다면, 오버라이딩 이전의 코드를 실행시킬 수 있다.
        class 기반클래스 : 
            def method():
                코드
            def method2(var1, var2):
                코드
    
    # Overriding
        clss 파생클래스 (기반클래스명):
            def method():
                재정의할 코드
            def method2(var1, var2):
                재정의할 코드
    

    다중 상속

    • 다중 상속이란 2개 이상의 기반 클래스에서 상속을 받는 것이다.
      • 서로 다른 클래스의 기능을 모두 사용하고 싶을 때 사용한다.
        class 기반클래스 1: 
            def __init(self):
                코드
    
        class 기반클래스 2: 
            def __init(self):
                코드
    
        clss 파생클래스 ( 기반클래스1 , 기반클래스2 ):
            def __init(self):
                super().__init__()
                코드    
    

    다이아몬드 상속

    • 하나의 기반 클래스 A가 B, C에 상속을 시켜주고, D가 B, C에게서 상속을 받는 모양이다.
      • 구조가 복잡하여 클래스의 탐색 순서를 확인하고 사용하는 것을 권장함
        • 필자가 생각하기에는 그냥 안 쓰는 걸 권장합니다. ( 이유 : 오버라이딩을 했다면, 어떤 메소드를 사용할지 명확하지 않음 )
        • 그래도 사용하고 싶다면, 클래스.mro()를 사용하여 호출 순서를 확인하고 사용하는 것이 좋다.

    추상 클래스

    기본개념

    • 클래스를 생성할 때 기본적으로 구현해야 하는 메소드들의 틀을 만들어 주는 클래스
    • 추상 클래스를 상속받은 클래스가 추상 클래스에서 정의한 메소드들을 구현하지 않는다면 에러 발생

    생성 방법

    • 사용하려면 abc (abstract base class ) 모듈을 반드시 import 해야 한다.
      • from abc import * 혹은 import abc
    • 추상 클래스의 메소드는 @abstractmethod를 붙여주어 상속 클래스라는 것을 명시해준다.
      • 만약 import abc로 호출하였다면, @abc.abstractmethod 라고 적어야 한다.
    • 클래스 괄호 안에 metaclass = ABCMeta를 삽입한다.
      • ABCMeta 또한 abc.ABCMeta라고 적어야 한다.
    • 추상 클래스는 상속시켜 오버라이딩을 하기 때문에 다른 코드를 삽입할 필요가 없다.
      • 기본적으로 추상 클래스는 인스턴스를 생성할 수 없다.
    from abc import *
    
    class 추상클래스명 ( metaclass = ABCMeta):
        @abstractmethod
        def 메소드명(self):
            pass
        @abstractmethod
        def 메소드명(var1,var2):
            pass
    

    '프로그래밍 및 IT > 파이썬 ( Python )' 카테고리의 다른 글

    파이썬( 예외 처리 )_11  (0) 2021.05.14
    파이썬(함수)_09  (0) 2021.05.06
    파이썬(파일 입출력)_08  (0) 2021.05.02
    파이썬(문자열)_07  (0) 2021.04.30
    파이썬(반복문)_06  (0) 2021.04.29

    + Recent posts