일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- EC2
- 클래스
- numpy
- Django
- cerbot
- 백엔드 인턴십
- API
- mock server
- RDS
- 코딩테스트
- 프로그래머스
- 컴프리헨션
- todo project
- 조건연산
- 람다함수
- Postman
- Comprehension
- spring boot
- 프리온보딩
- 집계함수
- 파이써닉코드
- 행렬곱
- 함수
- sqlalchemy
- 토이프로젝트
- yaml
- PYTHON
- self
- Jar배포
- 파이썬
- Today
- Total
build my life
[Python] 상속 본문
상속
- 이미 구현된 클래스의 기능(메소드)을 그대로 가져다가 사용하거나 아니면 그 기능을 수정하거나 추가할 때 사용하는 개념
- 부모 클래스의 속성(인스턴스변수와 메소드)들과 자식클래스가 그대로 물려받는 개념
- 확장 개념, 부모클래스와 자식클래스가 합쳐지는 개념
#부모클래스
class PlayerCharacter:
def __init__(self, hp = 100, exp = 0):
print(f"부모의 주소값 : {id(self)}")
self.hp = hp
self.exp = exp
def attack(self):
print("공격하기")
self.exp = self.exp + 2
def defend(self):
print("방어하기")
self.exp = self.exp + 1
#자식클래스
class Wizard(PlayerCharacter): #부모클래스 상속
def __init__(self, mp):
print(f"자식의 주소값 : {id(self)}")
self.mp = mp
super().__init__() #부모클래스에 접근해서 __init__(생성자)을 실행하겠다.
def magic_skill(self):
print("마법공격하기")
self.mp -= 2
✅ 자식클래스가 부모 클래스를 상속받기 위해서는 "class 클래스명(부모클래스)" 로 작성해줘야한다.
✅ 자식클래스가 부모 클래스의 인스턴스변수를 가져다가 사용하려면 자식클래스의 __init__ 메소드 안에 "super().__init__()" 을 선언해줘야 접근 가능하다.
✅ 상속을 하면 정말 부모클래스와 자식클래스가 합쳐질까? -> 주소값 확인한 결과 두 클래스가 같은 주소값을 가지고 있는것이 확인이 된다.
오버라이딩
- 부모로 부터 받는 메소드를 수정하고 싶을 때 자식클래스에서 재정의 하는 것
#부모클래스
class PlayerCharacter:
def __init__(self, hp = 100, exp = 0):
self.hp = hp
self.exp = exp
def attack(self):
print("공격하기")
self.exp = self.exp + 2
def defend(self):
print("방어하기")
self.exp = self.exp + 1
#자식클래스
class Wizard(PlayerCharacter):
def __init__(self, mp):
self.mp = mp
super().__init__() #부모클래스에 접근해서 __init__(생성자)을 실행하겠다.
def magic_skill(self):
print("마법공격하기")
self.mp -= 2
#오버라이딩
def defend(self):
print("마법사가 방어!")
self.exp = self.exp + 5
✅ 오버로딩과 오버라이딩의 차이
- 오버로딩(overloading) : 새로운 메소드를 정의하는 것
- 오버라이딩(overriding) : 상속 받은 기존의 메소드를 재정의하는 것
✅ 오버라이딩의 필요성
- 상속 받은 메소드를 그대로 사용할 수 있지만, 자식 클래스에서 상황에 맞게 변경해야하는 경우 필요가 생긴다.
- 오버라이딩을 하지 않으면 이름을 다르게 해야하는데 그럼 그 메소드가 여전히 살아 있기에 문제 발생!
- 알맞지 않은 기능은 못쓰게 해야 하기 때문에 이 기능을 다른 기능으로 바꾸기 위해 오버라이딩 사용
(참조:http://wiki.hash.kr/index.php/%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9)
오버라이딩이 단순히 비효율적이라고 생각했다. 그냥 부모 클래스에 있는 코드를 바꾸면 되지 않나?
오늘 본 예시에서는 자식클래스가 하나이지만 상속 받는 자식클래스가 많을 경우 각각 클래스마다 상황에 맞게 변경해야하는 경우가 생긴다.
이런 경우에는 부모클래스에 있는 메소드의 기능을 다른 기능으로 바꿔야하기 때문에 오버라이딩이 필요하다는 걸 알게 되었다.
'Python' 카테고리의 다른 글
[Python] DB 연결 및 테이블 정보 불러오기 (pymysql 사용) (0) | 2022.08.23 |
---|---|
[Python] 예외처리(Exception handling) (1) | 2022.08.22 |
[Python] 클래스 (0) | 2022.08.09 |
[Python] 데코레이터(Decorator) (0) | 2022.08.09 |
[Python] 클로저(Closure)와 콜백함수(Callback) (0) | 2022.08.08 |