매번 메소드 오버로딩과 메소드 오버라이딩을 햇갈려서 제 나름대로 정리해서 적습니다. 혹시 틀린 부분이 있다면 지적해주시길 부탁드립니다.
설명은 파이썬으로 되어 있지만, 메소드 오버라이딩 개념 자체는 모든 언어에 동일한 것으로 알고 있습니다. 파이썬은 타언어보다 작성 및 가독이 더 쉬운 편이니 타언어 사용자도 이 글로 내용 이해를 하시는데 지장 없을거라 생각합니다.
메소드 오버라이딩은 상위 클래스 안에 선언된 메소드(함수)를 하위 클래스에서 새로 선언 혹은 정의(덮어쓰는, 오버라이드)하는 것을 말합니다. 아래에 Animal 클래스 안에 선언된 greet 메소드를 Human 클래스와 Dog 클래스에서 오버라이딩하는 예시 코드와 주석을 작성했습니다.
'개'와 '사람'은 둘 다 '동물' 입니다. 그래서 동물 클래스가 가지고 있는 특성들을 모두 상속 받을 수 있습니다. 동물 클래스에 걷고, 먹고, 인사하는 기능인 walk, eat, greet 메소드를 넣었습니다.
class Animal():
def __init__(self, name):
self.name = name
def walk(self):
print('{} walk'.format(self.name))
def eat(self):
print('{} eat'.format(self.name))
def greet(self):
print('{} greet'.format(self.name))
class Human(Animal): #Human() 괄호 안에 Animal 을 넣어 Animal class 를 상속시켰습니다.
def __init__(self, name, hand): # 클래스 초기화 함수인 __init__ 에 매개변수로 사람의 이름과 손의 방향을 넣었습니다.
super().__init__(name) # 사람의 이름을 의미하는 매개변수인 name 은 super() 메소드를 통해 Human이 상속받은 클래스인
# Animal 의 초기화 함수를 불러와 입력받습니다.
self.hand = hand # Animal 클래스는 이름만 요소로 가지지만 Human 클래스는 이름과 손을 요소로 갖습니다.
def wave(self):
print('{} wave {} arm'.format(self.name, self.hand))
def greet(self):
self.wave() # 아래 Dog 클래스와 다르게 Human 클래스는 greet 메소드에서 wave 메소드를 불러와 팔을 흔들고
# 상위 클래스인 Animal 의 greet 메소드를 불러옵니다.
super().greet()
class Dog(Animal):
def __init__(self, name):
self.name = name
def bark(self):
print('{} bark to you for greeting'.format(self.name))
def greet(self): # Human 클래스와 다르게 Dog 은 bark 메소드를 불러와 짖으며 인사합니다.
self.bark()
animal = Animal('my_animal') # Animal 인스턴스 생성
person = Human('Peter','right') # Human 인스턴스를 생성
my_dog = Dog('Puppy') # Dog 인스턴스를 생성
animal.greet() # Animal 인스턴스의 greet 메소드를 호출
person.greet() # Human 인스턴스의 greet 메소드를 호출
my_dog.greet() # Dog 인스턴스의 greet 메소드를 호출
animal.walk() # Animal 인스턴스의 walk 메소드를 호출
person.walk() # Human 인스턴스의 walk 메소드를 호출
my_dog.walk() # Dog 인스턴스의 walk 메소드를 호출
코드의 실행결과
메소드 오버라이딩이 된 greet 함수는 세 개의 인스턴스가 각각 클래스 안에 선언된 메소드가 실행됬지만,
메소드 오버라이딩이 되지 않은 walk 함수는 Human 과 Dog 클래스 안에서 선언되지 않았지만 부모 클래스인 Animal 의 메소드가 실행되었습니다.