본문 바로가기
Java_language

메서드 오버라이딩 (Method Overriding)

by 헬로제이콥 2025. 11. 24.

 

덮어쓰기: 메서드 오버라이딩 (Method Overriding)

메서드 오버라이딩은 부모 클래스(Parent Class)로부터 상속받은 메서드의 내용을 자식 클래스(Child Class)에서 새로 정의(덮어쓰기)하는 기능입니다.

쉽게 말해, 아빠(부모)가 하는 행동(메서드)을 아들(자식)이 물려받았지만, 아들의 방식대로 똑같은 행동을 다르게 하는 것입니다.

🔑 오버라이딩의 필수 조건

메서드 오버라이딩이 성립하려면 다음 세 가지 조건을 모두 만족해야 합니다.

  1. 메서드 이름이 같아야 합니다.
  2. 매개변수(입력)의 개수, 타입, 순서가 모두 같아야 합니다. (메서드의 시그니처(Signature)가 완전히 같아야 함)
  3. 반환 타입(출력)이 같아야 합니다. (자바 1.5 이후부터는 부모 메서드가 반환하는 타입의 자식 타입까지 허용됨)

💡 핵심: 오버로딩은 메서드를 추가하는 것이고, 오버라이딩은 메서드를 덮어써서 교체하는 것입니다.


📝 오버라이딩 예제: "말하기" 행동

동물 클래스와 이를 상속받은 고양이, 강아지 클래스를 통해 오버라이딩을 살펴볼게요. 모든 동물은 말하다()라는 행동을 가지고 있지만, 각자 다른 소리를 냅니다.

Java
 
// 부모 클래스
class Animal {
    public void 말하다() {
        System.out.println("동물이 울음소리를 냅니다.");
    }
}

// 자식 클래스 1
class Dog extends Animal {
    // 부모의 말하다() 메서드를 덮어쓰기(오버라이딩)
    @Override
    public void 말하다() {
        System.out.println("🐕 멍멍! (강아지가 짖습니다.)");
    }
}

// 자식 클래스 2
class Cat extends Animal {
    // 부모의 말하다() 메서드를 덮어쓰기(오버라이딩)
    @Override
    public void 말하다() {
        System.out.println("🐈 야옹! (고양이가 울어요.)");
    }
}

💻 메서드 실행

각 객체(강아지, 고양이)가 자신의 방식으로 말하다() 메서드를 실행합니다.

Java
 
public class OverridingExample {
    public static void main(String[] args) {
        
        Animal genericAnimal = new Animal();
        Dog myDog = new Dog();
        Cat myCat = new Cat();
        
        genericAnimal.말하다(); // 부모 클래스의 메서드 실행
        myDog.말하다();         // Dog 클래스가 덮어쓴 메서드 실행
        myCat.말하다();         // Cat 클래스가 덮어쓴 메서드 실행
    }
}

💻 결과:

동물이 울음소리를 냅니다.
🐕 멍멍! (강아지가 짖습니다.)
🐈 야옹! (고양이가 울어요.)

🌟 오버라이딩을 사용하는 이유

오버라이딩은 객체 지향 프로그래밍의 핵심 개념인 다형성(Polymorphism)을 구현하는 데 사용됩니다.

  • 다형성 (Polymorphism): 같은 이름의 메서드를 호출하더라도, 어떤 객체(Dog, Cat)인지에 따라 다른 결과(멍멍, 야옹)가 나오는 능력입니다.
  • 재사용 및 맞춤화: 부모 클래스의 기본 기능(뼈대)은 상속받아 재사용하면서, 각 자식 클래스(강아지, 고양이)의 특성에 맞게 기능을 맞춤 설정(Customization)할 수 있습니다.
  • Override: 코드 위에 붙은 Override는 필수는 아니지만, '이 메서드는 오버라이딩된 것이다'라고 컴파일러와 다른 프로그래머에게 알려주는 표시(어노테이션)로, 실수를 줄이는 데 큰 도움이 됩니다.