OOP 2
- 상속
클래스 간에 상하관계가 형성됨.
기존 메서드를 하위 클래스에 그대로 물려줌.
상속이 필요한 이유
→ 코드의 재사용 + 클래스 간에 계층구조를 형성하고 클래스 간 관계를 표현할 수 있음.
유지보수 입장에서도 클래스 수정의 범위를 최소화할 수 있어서 효율적이다.
- super()
- 다중 상속
둘 이상의 상위 클래스로부터 여러 행동이나 특징을 상속받을 수 있다.
일반 상속처럼 상속받은 모든 것을 활용할 수 있다.
중복된 속성이나 메서드가 있는 경우 상속 순서에 의해 결정된다.
- 다이아몬드 문제
둘 이상 클래스에서 상속을 받을 때 중복되는 속성, 행동을 어디서 받을 것인가?
→ MRO 알고리즘을 사용하여 깊이 우선으로, 왼쪽에서 오른쪽으로 가면서 먼저 상속받은 클래스 기준을 정하고 동시에 그 순서로 클래스를 참조한다.
그리고 super()는 이러한 우선 상속 순위를 자동으로 반영하여 대상이 되는 부모 클래스 중 다음에 호출될 메서드를 결정하여 호출한다.
- super의 2가지 사용 사례
단일 상속 구조 → 부모 클래스의 이름 변경이 되어도 코드 수정이 불필요
다중 상속 구조 → MRO에 맞게 순서대로 부모 클래스를 호출해줌.
<에러와 예외>
- 디버깅
버그 : 소프트웨어에서의 오류, 결함 / 프로그램의 예상된 동작과 실제 구현된 모습의 불일치
디버깅 : 결함이나 오류를 해결하는 작업
디버깅 방법
- print 함수 활용
- 개발 환경 등에서 제공하는 기능 활용 (vscode 등)
- 파이썬 튜터 활용
- 뇌 컴파일, 눈 디버깅… 등
에러 : 실행 중에 발생하는 예외 상황
- 파이썬의 에러 유형
- 문법 에러 : 프로그램 구문이 올바르지 않은 경우 발생 (오타, 괄호 및 콜론 누락 등 문법적 오류)
- 예외 : 문법 에러 이외의 모든 것! 프로그램 실행 중 감지되는 에러
문법 에러 예시
invalid syntax : 문법 구조상 뭐가 빠졌다.
assign to literal : 잘못된 할당
end of line : 끝 마무리 잘 안했다.
end of file : 파일 구문 마무리 잘 안했다.
- 내장 예외
예외 상황을 나타내는 예외 클래스들이 내장되어있다.
특정 상황이 벌어지면 클래스를 활용하게 해준다.
단순히 예외가 발생했다고 알려주는 것을 넘어서 클래스를 통해 예외를 처리할 수 있도록 클래스화 한 것이다.
- 예외 처리
try와 except
내장 예외 클래스는 상속 계층구조를 가지기 때문에
except 절로 분기할 때는 반드시 하위 클래스를 먼저 확인 할 수 있도록 작성해야 한다.
except 절 안에서 위에서부터 아래로 내려오면서 쭉 보게 된다. (if 절 처리처럼!)
- as 키워드
as 키워드를 사용해서 터미널에 나오는 에러 메세지를 가져와서 사용할 수 있다.
f 스트링에서 as 임의 변수를 가져오면 임의 변수가 에러 유형명으로 출력된다.
- EAFP
‘허락보다 용서를 구하는 것이 쉽다’
일단 지르고 나중에 용서해달라고 할게~ 일단 실행한다는 느낌!
예외 처리를 중심으로 코드를 작성하는 방식 (try - except)
- LBYL
‘도약하기 전에 확인하자’ = ‘돌다리도 두드려보자’
값 검사를 중심으로 코드를 작성하는 접근 방식 (if - else)
- 예외
시스템 내부적으로 발생하는 에러들은 알아채기 쉽지 않다.
if-else 로 구성하면 점점 양도 많아지고 가독성도 떨어지고 유지보수도 힘들어진다.
하지만 except를 사용하면 정상적인 경우와 비정상적인 경우를 2개로 분리하여 모두 모아서 볼 수 있게 된다.