메서드 오버라이딩(overriding)은 OOP의 메커니즘으로, 서브클래스가 슈퍼클래스에서 이미 정의된 메서드에 대한 자체 구현을 제공하는 것입니다. 서브클래스의 메서드는 비슷한 이름과 매개변수 및 반환 타입(또는 그 하위 타입)을 가져야 합니다.
주요 규칙:
@Override 주석을 사용하면 컴파일 타임에 오류를 발견하는 데 도움이 됩니다.예시:
class Animal { public void sound() { System.out.println("Some sound"); } } class Dog extends Animal { @Override public void sound() { System.out.println("Woof"); } }
질문: "자바에서 static 메서드를 오버라이드할 수 있나요?"
답변: 아니요, static 메서드는 오버라이드할 수 없습니다. 이들은 숨겨집니다(method hiding). 서브클래스에 같은 시그니처의 static 메서드를 선언하면 숨겨짐이 발생하며, 오버라이드되지 않습니다.
예시:
class A { static void print() { System.out.println("A"); } } class B extends A { static void print() { System.out.println("B"); } } A obj = new B(); obj.print(); // "A"를 출력합니다
이야기
프로젝트에서 한 개발자가 상속된 클래스에서 static 메서드를 "오버라이드"하려고 시도했습니다. 슈퍼클래스 참조를 통해 서브클래스의 버전을 호출할 것이라고 기대했으나, 예기치 않은 결과가 발생했습니다: 슈퍼클래스의 메서드가 호출되어 프로그램이 잘못 작동했습니다.
이야기
@Override주석을 사용하는 것이 중요합니다. 한 프로젝트에서 개발자가 오버라이드할 때 메서드 이름에 오류를 범했고, 주석이 없어서 컴파일러가 오류를 내지 않았습니다. 그 결과 상속 구조에 따라 기본 클래스의 메서드가 호출되어 비즈니스 프로세스에서 잘못된 논리가 발생했습니다.
이야기
checked 예외의 재정의: 개발자가 오버라이드된 메서드에서 원래 시그니처에 지정되지 않은 새로운 checked 예외를 던지도록 추가했습니다. 코드는 오류와 함께 컴파일되었고 아키텍처를 변경해야 했습니다. 이는 예외 재정의 규칙을 위반하기 때문입니다.