오버라이딩(Overriding)은 상속받은 메서드를 자식 클래스에서 같은 이름, 같은 매개변수, 같은 반환 타입으로 다시 정의하는 것입니다.
자식 클래스는 부모 클래스의 기본 동작을 변경하거나 확장할 수 있습니다.
@Override
public 반환타입 메서드이름(매개변수목록) {
// 새로운 구현 내용
}
@Override 어노테이션은 컴파일러에게 오버라이딩을 명시적으로 알려주는 역할을 합니다.
어노테이션을 생략해도 작동하지만, 붙이는 것이 일반적으로 권장됩니다. 실수로 메서드 시그니처가 달라질 경우 오류를 바로 알 수 있기 때문입니다.
class Animal {
void sound() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("강아지가 멍멍 짖습니다.");
}
}
public class Main {
public static void main(String[] args) {
Animal a = new Dog();
a.sound(); // 출력: 강아지가 멍멍 짖습니다.
}
}
Dog 클래스는 Animal 클래스의 sound() 메서드를 오버라이딩했습니다.
Animal a = new Dog(); 형태는 업캐스팅이 적용된 형태이며, 실행 시에는 Dog 클래스의 sound()가 호출됩니다. 이것이 다형성입니다.
조건 |
설명 |
---|---|
메서드 이름 |
부모 클래스와 동일해야 함 |
매개변수 리스트 |
부모 클래스와 정확히 일치해야 함 |
반환 타입 |
부모 클래스와 같거나 더 좁은 범위(covariant) |
접근 제어자 |
부모보다 좁아질 수 없음 (동일하거나 더 넓어야 함) |
예외 처리 |
부모가 던지는 예외보다 같거나 더 적은 예외를 던져야 함 |
구분 |
오버라이딩(Overriding) |
오버로딩(Overloading) |
---|---|---|
정의 |
상속 관계에서 메서드 재정의 |
같은 클래스 내에서 메서드 이름 재사용 |
시그니처 |
동일해야 함 |
매개변수 개수 또는 타입이 달라야 함 |
목적 |
부모 클래스의 기능 수정 |
다양한 인자에 대응하는 유연성 제공 |
다형성 구현
상위 타입으로 선언된 객체가 실제로는 하위 클래스의 메서드를 실행할 수 있게 함.
기능 확장
기본 기능을 자식 클래스에 맞게 재정의하여 더 유용하게 사용 가능.
공통 인터페이스 사용 가능
인터페이스나 추상 클래스에서 정의한 메서드를 자식 클래스에서 구체화할 수 있음.