목차
클래스
기본개념
- 객체를 표현하기 위한 문법
클래스가 무엇이냐 하면 필자가 공부를 할 때는 항상 붕어빵 기계를 비유하면서 설명을 들었습니다.
적절한 표현이라고 생각합니다.
위 말은 즉**객체 ( 붕어빵 )** 을 동일하게 만들기 위해 **붕어빵 기계 ( 클래스 )**
가 필요하다는 것을 보여주고 싶었던 것 같네요.
이것을 제 말로 바꿔보면 객체 ( 붕어빵 ) 을 편하게 제작 및 변경( 팥 붕어빵, 슈크림 붕어빵. 등)하기 위해 붕어빵 기계가 있어야 한다는 것을 표현한 것 같네요.- 생성한 객체에 어떤 변형된 값을 넣느냐에 따라 값이 변하고, 동일한 것도 편하게 만들 수 있단, 뜻입니다.
클래스 및 메소드 만들기
- 클래스 또한 다른 메소드 만드는 방법과 동일하게 : 을 마지막에 붙여줍니다.
- 메소드의 인자 값의 첫 번째 값은 반드시 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)를 삽입시켜준다.
- 위와 같이 한다면, 명확히 부모 클래스로 연결된다.
- 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 |