오버로딩, 오버라이딩

moon.kick·2025년 2월 24일

맞아! 오버라이딩(Overriding)부모 클래스의 메서드를 자식 클래스에서 재정의하는 개념이야.
오버라이딩된 메서드는 부모 클래스의 원래 메서드보다 자식 클래스의 메서드가 우선적으로 실행돼.


오버라이딩(Overriding) 특징

  1. 상속 관계에서만 사용 가능 (extends를 사용한 클래스 상속 필수)
  2. 메서드 이름, 리턴 타입, 매개변수가 완전히 동일해야 함
  3. 부모 클래스의 메서드를 덮어씌움(재정의) → 호출하면 자식 클래스의 메서드가 실행됨
  4. @Override 어노테이션을 사용하면 오류 방지 가능 (선택 사항이지만 권장됨)

🎯 오버라이딩 예제

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

// 자식 클래스
class Dog extends Animal {
    @Override
    void makeSound() {  // 부모 메서드를 오버라이딩
        System.out.println("멍멍!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog(); // 부모 타입으로 자식 객체 생성 (업캐스팅)
        myDog.makeSound();  // 실행하면 어떤 메서드가 실행될까?
    }
}

📌 출력 결과:

멍멍!

👉 부모 클래스의 makeSound()가 아니라 오버라이딩된 Dog 클래스의 makeSound()가 실행됐지?
이게 동적 바인딩(Dynamic Binding) 때문이야.


오버라이딩의 핵심 개념: 동적 바인딩(Dynamic Binding)

자바에서는 메서드 호출 시, 객체의 실제 타입을 기준으로 실행돼.
즉, 참조 변수의 타입(Animal)이 아니라, 실제 생성된 객체(Dog)의 메서드가 실행되는 거야.

🔹 예제에서 myDog의 타입은 Animal이지만, 실제 객체는 Dog → 그래서 DogmakeSound()가 실행됨.


오버라이딩 vs 오버로딩 차이

항목오버라이딩 (Overriding)오버로딩 (Overloading)
목적부모 클래스의 메서드를 재정의같은 이름의 메서드를 여러 개 정의
사용되는 관계상속 (extends)이 필수같은 클래스 내에서 사용
메서드 이름동일해야 함동일해야 함
매개변수 개수/타입동일해야 함다르게 정의 가능
리턴 타입동일해야 함 (예외적으로 covariant return type 허용)상관없음
접근 제한자부모 메서드보다 더 좁은 범위로 수정 불가능 (예: protectedprivate 불가)제한 없음

🎯 오버로딩 예제

class MathUtils {
    int add(int a, int b) { return a + b; }
    double add(double a, double b) { return a + b; }  // 오버로딩
}

👉 매개변수의 타입이 다르므로 오버로딩이 성립됨.


결론

  • 오버라이딩부모 클래스 메서드를 자식 클래스에서 재정의, 실행하면 자식 클래스의 메서드가 우선 적용됨.
  • 동적 바인딩 때문에 참조 타입이 부모여도, 실제 객체의 메서드가 실행됨.
  • 오버라이딩과 오버로딩을 혼동하지 말 것! 🚀

이제 오버라이딩이 어떻게 동작하는지 이해됐지? 😊
더 궁금한 점 있으면 질문해줘~!

profile
@mgkick

0개의 댓글