본문 바로가기
Python/기본문법

메소드 오버라이드 (Method Override)란 (메소드 재정의)

by yororing 2024. 9. 30.

00 개요

  • 자바 및 파이썬의 클래스, 메소드에 대해 공부하고 있는데 '메소드 오버라이드 가능'이라는 개념에 대한 정리

 

01 메소드 오버라이드 (Method Override)란

1. 정의

  • 객체 지향 프로그래밍에서 자식 클래스가 부모 클래스에서 상속받은 메소드를 재정의하는 것을 의미
  • 즉, 자식 클래스에서 부모 클래스의 메소드를 같은 이름, 같은 매개변수 목록으로 다시 정의하여 기능을 변경하거나 확장하는 것

2. 특징

1) 메소드 이름과 매개변수

  • 오버라이드된 메소드는 부모 클래스의 메소드와 같은 이름과 같은 매개변수 목록을 가져야 됨

2) 부모 클래스의 구현을 대체

  • 자식 클래스에서 해당 메소드를 호출할 때, 부모 클래스의 메소드가 아닌 자식 클래스에서 정의한 메소드가 실행됨

3) 다형성 지원

  • 오버라이드는 다형성을 통해 같은 메소드 이름을 사용하더라도 객체의 종류에 따라 다른 구현을 제공할 수 있음
  • 다형성(Polymorphism)이란:
    • 정의: 객체 지향 프로그래밍의 중요한 개념 중 하나로, 같은 이름의 메소드가 다양한 객체에 대해 다른 행동을 할 수 있도록 하는 것. 오버라이드는 다형성을 구현하는 한 가지 방법
    • 오버라이드를 통한 다형성의 의미:
      • 1) 같은 메소드 이름: 여러 클래스에서 같은 이름의 메소드를 정의
      • 2) 객체의 종류에 따라 다른 구현: 각 클래스에서 해당 메소드를 오버라이드하여 서로 다른 동작을 구현
      • 3) 동적 바인딩: 프로그램 실행 중 객체의 타입에 따라 적절한 메소드가 선택되어 호출됨

3. 예시

1) 파이썬

# 부모 클래스 정의
class Animal:
    def sound(self):
        print("Animal makes a sound")

# 자식 클래스 Cat 정의
class Cat(Animal):
    def sound(self):  # 부모 클래스의 메소드를 오버라이드
        print("Cat meows")

# 자식 클래스 Cow 정의
class Cow(Animal):
    def sound(self):  # 부모 클래스의 메소드를 오버라이드
        print("Cow moos")

# 메인 실행 부분
if __name__ == "__main__":
    # Animal 타입의 리스트에 다양한 동물 객체 추가
    animals = [Cat(), Cow()]

    # 각 동물의 소리 출력
    for animal in animals:
        animal.sound()  # 각 객체에 맞는 sound() 메소드 호출
        
# 실행 결과
Cat meows
Cow moos
  • 설명:
    • 부모 클래스 Animal: 일반적인 동물 소리를 출력하는 sound() 메소드를 정의함
    • 자식 클래스 Cat, Cow: 각각의 클래스에서 sound() 메소드를 오버라이드하여 고유한 소리를 출력하도록 구현함
    • 다형성 구현:
      • animals 리스트에 서로 다른 종류의 동물 객체를 추가함
      • for 루프를 통해 animals 리스트를 순회하며, 각 객체에 대해 sound() 메소드를 호출
      • 이때 각 객체의 실제 타입에 맞는 오버라이드된 메소드가 실행됨 

2) 자바

public class practiseOverride {
    public static void main(String[] args) {
        // Animal 타입의 배열에 다양한 동물 객체 추가
        Animal[] animals = { new Cat(), new Dog() };

        // 각 동물의 소리 출력
        for (Animal animal : animals) {
            animal.sound(); // 각 객체에 맞는 sound() 메소드 호출
        }
    }

    static class Animal {
        void sound() {
            System.out.println("Animal makes a sound");
        }
    }

    static class Cat extends Animal {
        @Override
        void sound() {
            System.out.println("Cat meows");
        }
    }

    static class Dog extends Animal {
        @Override
        void sound() {
            System.out.println("Dog barks");
        }
    }
}
  • 설명:
    • 부모 클래스 Animal: 일반적인 동물 소리를 출력하는 sound() 메소드를 정의함
    • 자식 클래스 Cat, Dog: 각각의 클래스에서 sound() 메소드를 오버라이드하여 고유한 소리를 출력하도록 구현함
    • 다형성 구현:
      • 맨 위에 main()에서
        • Animal 타입의 배열에 Cat과 Cow 객체를 추가함
        • for-each 루프를 통해 배열을 순회하며 각 동물의 sound() 메소드를 호출하여 고유의 소리를 출력함 

4. 결론

  • 오버라이드를 통해 부모 클래스의 메소드를 자식 클래스에서 재정의하여, 각 클래스의 고유한 기능을 구현할 수 있음
  • 오버라이드는 객체 지향 프로그래밍에서 코드의 재사용성과 확장성을 높이는 중요한 개념