1. 클래스는 다른 클래스를 '상속'해서 내 것처럼 사용할 수 있다.
2. java나 javascript에서는 class ClassName extends ExtendedClass처럼 extends를 사용하지만, 파이썬에서는 class ClassName(ExtendedClass)처럼 표시하면 된다.
class NormalCar:
def drive(self):
print('[NormalCar] drive() called!!')
def back(self):
print('[NormalCar] back() called!!')
class TurboCar(NormalCar):
def turbo(self):
print('[TurboCar] turbo() called!!')
tc1 = TurboCar()
tc1.turbo() # [TurboCar] turbo() called!!
tc1.drive() # [NormalCar] drive() called!!
3. 객체가 생성될 때 생성자를 호출하면 __init__()가 자동 호출된다.
4. __init__()는 속성을 초기화한다.
5. 상위 클래스의 속성을 초기화하기 위해 super() 함수를 사용한다.
class P_Class:
def __init__(self, pNum1, pNum2):
print('[P_class] __init__() is called!!')
self.pNum1 = pNum1
self.pNum2 = pNum2
class C_Class(P_Class):
def __init__(self, cNum1, cNum2):
print('[C_Class] __init__() is called!!')
# P Class의 값을 상속받으려면 두 가지 방법이 있는데
# 하나는 __init__을 직접 넣는 것이고
# P_Class.__init__(self, cNum1, cNum2)
# 다른 하나는 super()를 이용하는 것이다(self는 넣을 필요 없다)
super().__init__(cNum1,cNum2)
self.cNum1 = cNum1
self.cNum2 = cNum2
cls = C_Class(10, 20)
# [C_Class] __init__() is called!!
# [P_class] __init__() is called!!
6. 다중 상속은 2개 이상의 클래스를 상속하는 것이다. 여러 클래스를 콤마(',')로 구분하여 상속시키면 된다.
class Car1:
def drive(self):
print('drive() method called!!')
class Car2:
def turbo(self):
print('turbo() method called!!')
class Car3:
def fly(self):
print('fly() method called!!')
class Car4(Car1, Car2, Car3):
def walk(self):
print('walk() method called!!')
car1 = Car4()
car1.turbo() # turbo() method called!!
7. 오버라이딩은 하위 클래스에서 상위 클래스의 메소드를 재정의(override)하는 것이다.
class TriangleArea:
def __init__(self, w, h):
self.width = w
self.height = h
def printTriangleAreaInfo(self):
print(f'width: {self.width}')
print(f'height: {self.height}')
def getArea(self):
return self.width * self.height / 2
class NewTriangleArea(TriangleArea):
def __init__(self, w, h):
super().__init__(w, h)
def printTriangleAreaInfo(self):
super().printTriangleAreaInfo()
def getArea(self):
return f'{super().getArea()}cm' ## 오버라이딩
ta = NewTriangleArea(7, 5)
ta.printTriangleAreaInfo()
# width: 7
# height: 5
print(ta.getArea())
# 17.5cm
8. 추상클래스란 상위클래스에서 하위 클래스에 메소드 구현을 강요한다.
9. 추상클래스를 선언하기 위해서는 ABCmeta와 abstractmethod를 abc모듈로부터 import하고, @abstractmethod라는 어노테이션을 붙여주는 등(데코레이션)의 작업이 필요하다. 예는 다음과 같다.
from abc import ABCMeta
from abc import abstractmethod
class AirPlane(metaclass=ABCMeta):
@abstractmethod
def flight(self):
pass
class Airliner(AirPlane):
def flight(self):
print('flight method 호출!!')
def move(self):
print('move method 호출!!')
ap1 = Airliner()
ap1.flight()
10. '예외' 란 문법적인 문제는 없으나 예상하지 못한 문제로 프로그램 실행이 어려운 상태를 의미한다.
11. '예외' 관련 클래스는 Exception 클래스를 상속한다.
12. 에러의 경우 프로그램 자체가 중단되어버리지만, 예외처리가 발생했을 경우, 프로그램 전체 실행에 영향이 없도록 해당 부분만 별도 처리한다.
13. 예외처리를 하는 구문은 try ~ except ...이다.
n1 = 10
n2 = 0
# 오류 발생
print(n1 / n2)
print(n1 + n2)
print(n1 - n2)
print(n1 * n2)
# try except 사용하면 다른 부분은 진행
try:
print(n1 / n2)
except:
print('예상치 못한 오류가 발생했습니다.')
print(n1 + n2)
print(n1 - n2)
print(n1 * n2)
14. PEP8에 따르면, except만 사용하여 오류를 잡는 것은 바람직하지 않다. else, finally 등을 이용하여 구체적으로 오류를 잡아야 한다.
15. try ~ except ... else구문은 예외가 발생하지 않은 경우에 사용하는 구문이다.
16. finally 구문은 예외 발생과 상관없이 항상 실행하는 구문이다.
17. Exception 클래스는 예외를 담당하는 클래스이다. except Exception as e:의 방식으로 사용한다.
num1 = int(input('input num1: '))
num2 = int(input('input num2: '))
try:
print(f'num1 / num2: {num1 / num2}')
except Exception as e:
print('오류 발생')
print(f'exception: {e}')
else:
if num1 % 2 == 0 and num1 != 0:
print('num1은 짝수입니다.')
finally:
print(f'입력한 num1 타입 : {type(num1)}, num2 타입 : {type(num2)}')
18. raise 키워드를 사용하면 강제로 예외를 발생시킬 수 있다.
19. 사용자 예외 클래스를 만들 수도 있다. Exception 클래스를 상속해야 한다.
class NotUseZeroException(Exception):
def __init__(self, n):
super().__init__(f'{n}은 사용할 수 없습니다!!')
def divCalculator(num1, num2):
if num2 == 0:
raise NotUseZeroException(num2)
else:
print(f'{num1} / {num2} = {num1 / num2}')
num1 = int(input('input num1: '))
num2 = int(input('input num2: '))
try:
divCalculator(num1, num2)
except NotUseZeroException as e:
print(e)
'파이썬 공부중 > 파이썬 중급' 카테고리의 다른 글
| 파이썬 중급 05. 파일 읽고 쓰기 (1) | 2024.02.10 |
|---|---|
| 파이썬 중급 03. 객체 지향 프로그래밍, 클래스, 얕은 복사와 깊은 복사 (1) | 2024.02.10 |
| 파이썬 중급 02. 모듈에 대하여 (1) | 2024.02.10 |
| 파이썬 중급 01. 함수에 대하여 (1) | 2024.02.10 |