자식 클래스는 부모 클래스의 모든 메소드를 상속받습니다. 만약 개발자가 여기에 만족하지 않는다면 자식 클래스에서는 부모 클래스의 메소드 중에서 필요한 것을 다시 정의할 수 있습니다.
이것을 "자식 클래스의 메소드가 부모 클래스의 메소드를 오버라이드(재정의)한다" 고 말합니다. 오버라이드(override)는 무시한다는 의미로 부모 클래스의 메소드를 무시하고 자신이 다시 정의하겠다는 것입니다.
메소드 오버라이딩은 상속에서 부모 클래스의 메소드를 변경하는 것이 필요할 때 사용됩니다. 이때 메소드의 이름이나 매개 변수, 반환형은 동일하여야 합니다.
메소드 오버라이딩은 부모 클래스의 메소드를 자식 클래스가 자신의 필요에 맞추어서 변경하는 것입니다.
![]()
예를 들면 Animal 클래스에 eat() 이라는 메소드가 선언되어 있다고 합시다. Animal 클래스는 특정한 동물을 지칭하지 않으므로 eat() 메소드의 몸체는 구체적으로 채울 수 없습니다.
class Animal:
def __init__(self, name = ""):
self.name = name
def eat(self):
print("동물이 먹고 있습니다.")
Animal을 상속받아서 Dog 클래스를 선언하였다고 합시다. 이제는 eat() 메소드를 오버라이딩하여 봅시다.
그리고 Dog 클래스의 객체를 생성하고 eat() 을 호출하였다면 어떤 eat() 이 호출될까요?
class Animal:
def __init__(self, name = ""):
self.name = name
def eat(self):
print("동물이 먹고 있습니다.")
class Dog(Animal):
def __intit__(self):
super().__init__()
def eat(self): # 부모 클래스의 eat() 을 오버라이드하고 있습니다.
print("강아지가 먹고 있습니다.")
d = Dog()
d.eat()
<실행 결과>
강아지가 먹고 있습니다.
eat() 이 Dog 클래스의 객체에 대하여 호출되면 Dog 클래스 안의 eat() 이 호출됩니다. 즉 "Dog의 eat() 이 Animal의 eat 을 오버라이드한다" 라고 말할 수 있습니다.
1. 구체적인 예를 들어봅시다. 스포츠카는 일반적인 자동차의 특징을 모두 가지고 있고 추가로 터보 차저(turbo)가 추가되어 있다고 합시다.
이런 경우에는 스포츠카를 위한 클래스를 다시 작성하는 것보다는 일반적인 자동차를 나타내는 클래스인 Car 클래스를 상속받아 슈퍼카를 나타내는 클래스 SportsCar를 작성하는 것이 쉽습니다.
아래 그림을 참조하여 Car 클래스와 SportsCar 클래스를 작성해봅시다.

2. 상속의 예로 일반적인 다각형을 나타내는 Shape 클래스(x 좌표, y 좌표, area(), perimeter()) 를 작성합시다.
그리고 이것을 상속받아서 사각형을 나타내는 Rectangle 클래스(x 좌표, y 좌표, 가로 길이, 세로 길이, area(), perimeter())를 작성해봅시다.
<실행 결과>
사각형의 면적 : 20000
사각형의 둘레 : 600
3. 일반적인 사람을 나타내는 Person 클래스를 정의합니다. Person 클래스를 상속받아서 학생을 나타내는 클래스 Student와 선생님을 나타내는 클래스 Teacher를 정의합니다.
Person 클래스는 다음과 같은 인스턴스 변수를 가집니다.
Student 클래스는 다음과 같은 인스턴스 변수를 가집니다.
Teacher 클래스는 다음과 같은 인스턴스 변수를 가집니다.
모든 클래스에 __str__()을 정의하여 객체를 print() 함수로 출력하면 인스턴스 변수 값들이 출력되도록 합시다.
<실행 결과>
이름 = 홍길동
주민번호 = 12345678
수강 과목 = ['자료구조']
평점 = 0
이름 = 김철수
주민번호 = 1234567890
강의 과목 = ['Python']
월급 = 3000000
4. 메소드 오버라이드에 대한 간단한 실습을 하여 봅시다. 회사에 직원(Employee)과 매니저(Manager)가 있습니다. 직원은 월급만 있지만 매니저는 월급 외에 보너스가 있다고 합시다.
Employee 클래스를 상속받아서 Manager 클래스를 작성합시다. Employee 클래스의 getSalary()는 Manager 클래스에서 재정의됩니다.
Employee 클래스는 아래와 같은 인스턴스 변수와 메소드를 가지고 있습니다.
Manager 클래스는 아래와 같은 인스턴스 변수와 메소드를 가지고 있습니다.
<실행 결과>
이름 : 김철수; 월급 : 2000000; 보너스 : 1000000