1 분 소요

메소드 오버라이딩(Method Overriding)상속 관계에서 부모 클래스의 메서드를 자식 클래스가 동일한 시그니처로 다시 정의(재정의)하는 것입니다.

덕분에 다형성(Polymorphism) 이 실현되어, 부모 타입 변수로도 자식 고유의 동작을 호출할 수 있습니다.


오버라이딩 4대 조건

  1. 이름·매개변수·반환 타입 동일
  2. 접근 범위 축소 금지public → protected
  3. 예외 범위 확대 금지 – 더 넓은 checked 예외 선언 불가
  4. final·static 메서드는 불가static숨김(hiding) 처리

반환 타입은 Java 5부터 공변 반환(Covariant Return) 을 지원해, 부모보다 구체적(하위) 타입으로 변경 가능.


실전 예제

class Parent {
    void display() {             // 부모 메서드
        System.out.println("부모");
    }
}

class Child extends Parent {
    @Override                    // 컴파일러 검증
    void display() {             // 완벽히 동일한 시그니처
        System.out.println("자식");
    }
}

Parent p = new Child();
p.display();                     // 출력: 자식
  • 자식 객체를 부모 타입으로 다뤄도 오버라이딩된 메서드가 실행 → 런타임 다형성.

오버로딩 vs 오버라이딩 비교

항목 오버로딩 오버라이딩
관계 같은 클래스 상속 필수
시그니처 서로 다름 완전히 동일
반환 타입 제한 없음 공변 반환만 허용
접근 제어 자유 부모보다 좁게 불가

@Override 어노테이션 활용

  • 실수 방지 – 시그니처 불일치·오타 시 컴파일 오류
  • 가독성 향상 – “이 메서드는 오버라이딩입니다” 명시
class Dog extends Animal {
    @Override
    void sound() { System.out.println("Bark"); }
}

static 메서드는 숨김(Hiding)

class Parent { static void hi(){} }
class Child  { static void hi(){} } // NEW 메서드, 오버라이딩 아님
  • 호출은 참조 변수 타입에 따라 결정 → 다형성 X

베스트 프랙티스

  • 인터페이스·추상 클래스행동 규약 선언 → 자식이 오버라이딩해 구체 동작 구현
  • @Override 를 습관화해 오류 차단
  • 공통 로직은 부모 메서드(혹은 super.method() 호출) 안에 두고, 차별화 부분만 재정의

질문 정리

Q. private 메서드도 오버라이딩 가능한가요?

A. private 은 상속되지 않으므로 불가. 자식에선 새 메서드로 인식됩니다.

Q. 생성자는 오버라이딩 대상인가요?

A. 아니요. 생성자는 클래스 이름이 시그니처이므로 상속 대상이 아니며, 오버라이딩 개념이 적용되지 않습니다.

Q. 오버라이딩된 메서드에서 super 호출이 필요한가요?

A. 선택 사항입니다. 부모 로직을 확장하려면 super.method() 를 호출하고, 완전 교체하려면 호출하지 않습니다.


핵심 정리

  • 메소드 오버라이딩 = “부모 메서드를 같은 시그니처재정의
  • 다형성 구현에 필수 → 런타임에 객체 타입에 맞는 메서드 실행
  • @Override 로 안전성 확보, final/static 메서드는 제외

카테고리:

업데이트:

댓글남기기