메서드 오버라이딩(Method Overriding)은 자식 클래스에서 부모 클래스의 메서드를 재정의하는 개념입니다.
오버라이딩을 통해 자식 클래스는 부모 클래스의 메서드를 동일한 이름과 시그니처로 재정의하여 자신의 동작을 구현할 수 있습니다.
오버라이딩은 상속 관계에 있는 클래스들 간에 발생하며, 부모 클래스의 메서드를 자식 클래스에서 재정의하면 자식 클래스의 인스턴스에서 해당 메서드를 호출할 때 부모 클래스가 아닌 자식 클래스의 구현이 실행됩니다.
오버라이딩을 위해서는 다음 규칙을 따라야 합니다:
- 메서드 이름, 매개변수 개수, 타입, 순서가 동일해야 합니다. 이를 메서드의 시그니처(signature)라고 합니다.
- 접근 제어자는 부모 클래스의 메서드와 동일하거나 더 넓은 범위로 변경할 수 있습니다.
- 부모 클래스의 메서드가 final이거나 private인 경우 오버라이딩할 수 없습니다.
- 부모 클래스의 메서드가 인스턴스 메서드라면 자식 클래스에서도 인스턴스 메서드로 오버라이딩해야 합니다.
- 부모 클래스의 메서드가 반환 타입이 있는 경우, 자식 클래스에서 오버라이딩된 메서드의 반환 타입은 부모 클래스의 반환 타입과 같거나 그의 하위 타입이어야 합니다. Java 5 이전에는 반환 타입이 정확히 일치해야 했지만, Java 5부터는 공변 반환 타입(covariant return type)을 지원합니다.
class Animal {
public void makeSound() {
System.out.println("동물이 소리를 낸다.");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("강아지가 짖는다.");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Animal();
animal.makeSound(); // "동물이 소리를 낸다." 출력
Dog dog = new Dog();
dog.makeSound(); // "강아지가 짖는다." 출력
}
}
위의 예시에서 Animal 클래스는 makeSound 메서드를 정의하고 있습니다. 이를 자식 클래스인 Dog 클래스에서 오버라이딩하여 makeSound 메서드의 동작을 재정의했습니다. Main 클래스에서 Animal과 Dog 객체를 생성하여 makeSound 메서드를 호출하면, 각 객체의 오버라이딩된 메서드가 실행되어 강아지의 짖는 소리