맞아! 오버라이딩(Overriding)은 부모 클래스의 메서드를 자식 클래스에서 재정의하는 개념이야.
오버라이딩된 메서드는 부모 클래스의 원래 메서드보다 자식 클래스의 메서드가 우선적으로 실행돼.
extends를 사용한 클래스 상속 필수)@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) 때문이야.
자바에서는 메서드 호출 시, 객체의 실제 타입을 기준으로 실행돼.
즉, 참조 변수의 타입(Animal)이 아니라, 실제 생성된 객체(Dog)의 메서드가 실행되는 거야.
🔹 예제에서 myDog의 타입은 Animal이지만, 실제 객체는 Dog → 그래서 Dog의 makeSound()가 실행됨.
| 항목 | 오버라이딩 (Overriding) | 오버로딩 (Overloading) |
|---|---|---|
| 목적 | 부모 클래스의 메서드를 재정의 | 같은 이름의 메서드를 여러 개 정의 |
| 사용되는 관계 | 상속 (extends)이 필수 | 같은 클래스 내에서 사용 |
| 메서드 이름 | 동일해야 함 | 동일해야 함 |
| 매개변수 개수/타입 | 동일해야 함 | 다르게 정의 가능 |
| 리턴 타입 | 동일해야 함 (예외적으로 covariant return type 허용) | 상관없음 |
| 접근 제한자 | 부모 메서드보다 더 좁은 범위로 수정 불가능 (예: protected → private 불가) | 제한 없음 |
class MathUtils {
int add(int a, int b) { return a + b; }
double add(double a, double b) { return a + b; } // 오버로딩
}
👉 매개변수의 타입이 다르므로 오버로딩이 성립됨.
이제 오버라이딩이 어떻게 동작하는지 이해됐지? 😊
더 궁금한 점 있으면 질문해줘~!