상속은 부모 클래스의 정보를 활용해 자식 클래스를 이끌어내는 것을 의미합니다.
문법은
class 클래스명(부모클래스):
내부 정의
...
현실에서의 상속과 마찬가지로 프로그래밍의 상속에서도 부모는 자식에게
자신이 가진 요소를 물려줍니다.(변수, 메서드)
현실과 다른점은 프로그래밍의 상속은 자식이 부모를 지목해 이뤄지며
부모쪽에서 물려받은 변수, 메서드 및 자식쪽에서 새로 정의한 변수,
메서드 그리고 물려받은 메서드를 재정의(오버라이딩)해 사용할 수 있습니다.
class Person:
name = ""
age = 0
height = 0
p1 = Person()
p1.name = "홍길동"
p1.age = 20
p1.height = 170
print(p1.name, p1.age, p1.height)
# Student는 Person의 상속을 받았음
class Student(Person):
major = ""
# Student를 하나 생성해서 Person처럼 print로 모든 변수에 값을 저장한 뒤 찍어보세요.
s1 = Student()
s1.major = "경영"
s1.name = "유재석"
s1.age = 23
s1.height = 180
print(s1.major, s1.name, s1.age, s1.height)
자료구조를 아래와 같이 그릴수 있다
(연습)
# 샐러리맨 클래스를 선언해주세요(Person을 상속받습니다.)
# 샐러리맨은 연봉을 가집니다.
# 샐러리맨 객체를 생성해주세요.
# 이름은 여러분들 이름으로 해 주시고
# 기타 인적사항은 원하는대로 입력해주시고
# *연봉은 받고 싶은 금액을 적어주세요.
class Man(Person):
salary = 0
m1 = Man()
m1.salary = 200000000
m1.name = "김연봉"
m1.age = 23
m1.height = 180
print("이름 : %s 나이 : %s 신장 : %s 연봉 : %s"
% (m1.name, m1.age, m1.height, m1.salary))
오버라이딩이란 부모가 물려준 메서드를 자식쪽에서 고쳐서 쓰는 것을 의미합니다.
위와 같이 부모쪽에서 이미 특정 메서드가 생성되었지만, 자식쪽에서 추가된 사항을 따로 반영하지 못한다던지 하는 이슈가 발생했을 때
자식쪽에서 물려받은 메서드를 고쳐서 현재 객체 상황에 맞게 쓰는 것을 오버라이딩이라고 합니다
방법은 자식쪽 클래스 설계부분에 부모쪽과 동일한 메서드를 작성하고
코드 내용을 새롭게 작성하면 됩니다.
class Airplane:
velocity = 0
gas = 0
flight_number = ""
# 생성자를 만들어주세요. 위 3개 변수를 모두 입력해야 생성됩니다
def __init__(self, velocity, gas, flight_number):
self.velocity = velocity
self.gas = gas
self.flight_number = flight_number
# 비행기의 비행기능을 만들어보겠습니다.
def fly(self):
# if문을 이용해서 최대속도를 900으로 맞춰주세요.
# 이와 더불어 연료가 0이면 작동하지 않게 해주세요.
if (self.gas <=0):
print("연료가 없습니다.")
return # break문 처럼 즉시 함수를 종료시킨
if(self.velocity + 200 > 900):
self.velocity = 900
else:
self.velocity += 200
self.gas -= 100
# 여러분들이 비행기의 브레이크 기능을 만들어주세요
# 실행시 연료는 소비하지 않지만 속도가 200씩 차감됩니다.
def break_01(self):
# 최저속도를 0으로 만들어주세요.
if (self.velocity-200 < 0):
self.velocity = 0
else:
self.velocity -= 200
# 비행기의 현재 상태
def get_info(self):
print("현재 속도 : %skm/h, 현재 연료량 : %sL, 편명 : %s"
% (self.velocity, self.gas, self.flight_number))
ap1 = Airplane(0, 5000, "KE889")
ap1.get_info()
ap1.fly()
ap1.get_info()
ap1.break_01()
ap1.get_info()
# 초음속비행기(SupersonicAirplane)을 선언해주세요. (Airplane을 상속합니다.)
class SupersonicAirplane(Airplane):
# 오버라이딩은 부모에게 물려받은 메서드가 마음에 안 들때
# 새롭게 정의하는 것을 의미합니다.
# 같은 이름, 같음 파라미터선언으로 정의하면 됩니다
def fly(self):
# 메서트명과 파라미터는 동일하나 코드가 바뀜
if (self.gas <=0):
print("연료가 없습니다.")
return # break문 처럼 즉시 함수를 종료시킨
if(self.velocity + 200 > 2000):
self.velocity = 2000
else:
self.velocity += 200
self.gas -= 100
# 비행기 ap2를 만들어서 최대 시속 over로 fly를 호출(5번 이상) 해서
# 900이상 올라가지 않음을 확인해주세요
# 초음속비행기 sa1을 만들어서 최대시속 over로 fly를 호출(11번 이상)해서 2000이상
# 올라가지 않음을 확인해주세요
ap2 = Airplane(0, 5000, "22")
for i in range(11):
ap2.fly()
print(ap2.velocity, ap2.gas, ap2.flight_number)
sa1 = SupersonicAirplane(0,5000,"33")
for i in range(11):
sa1.fly()
print(sa1.velocity, sa1.gas, sa1.flight_number)