topic난이도 · 약 20

오버라이딩(Overriding)

부모 클래스의 메서드를 자식 클래스에서 같은 시그니처로 재정의하는 것.

#Java#다형성#동적바인딩
왜 배우는가

다형성의 실체. 어떤 메서드가 실제로 호출되는지는 실행 시점의 객체 실제 타입이 결정한다. '동적 바인딩'의 핵심.

과 철자는 비슷하지만 완전히 다른 개념이다. 오버로딩은 같은 클래스 안에서 매개변수가 다른 여러 메서드, 오버라이딩은 상속 관계에서 같은 시그니처를 자식이 재정의하는 것이다.

오버라이딩 조건: ① 메서드 이름/매개변수/반환타입이 같을 것 ② 접근 제어자는 부모와 같거나 더 넓게 ③ 부모보다 더 큰 예외를 throw 할 수 없음

java
class Animal {
    void sound() { System.out.println("소리"); }
}
class Cat extends Animal {
    @Override
    void sound() { System.out.println("야옹"); }
}

Animal a = new Cat();
a.sound(); // 야옹  ← 실행 시점에 실제 객체(Cat)의 메서드가 호출됨

참조 변수는 Animal 타입이지만 실제 객체는 Cat이므로 Cat의 sound()가 실행된다. 이것을 동적 바인딩(Dynamic Binding)이라 한다.

@Override 어노테이션은 필수가 아니지만, 오타로 인한 실수를 컴파일러가 잡아주므로 붙이는 것이 표준이다.

실기 드릴 2문항
code실기 드릴 · 코드 추적

다음 코드의 출력은?

java
class Parent {
    String greet() { return "부모"; }
}
class Child extends Parent {
    String greet() { return "자식"; }
}
public class Test {
    public static void main(String[] args) {
        Parent p = new Child();
        Child c = new Child();
        System.out.println(p.greet() + "," + c.greet());
    }
}
check_circle실기 드릴 · OX

오버라이딩 시 자식 메서드의 접근 제어자를 부모보다 더 좁게 설정할 수 있다.