객체지향 프로그래밍의 핵심인 다형성을 구현하는 두 메커니즘, 오버로딩(Overloading)과 오버라이딩(Overriding)의 상세 규칙과 내부 동작
오버로딩은 같은 이름의 메소드를 '과적'하여 사용자에게 편의성을 제공하는 기술입니다.
class Logger {
// 1. 문자열 로그
void log(String message) { System.out.println("Log: " + message); }
// 2. 에러 코드와 함께 로그 (오버로딩)
void log(String message, int errorCode) {
System.out.println("Error " + errorCode + ": " + message);
}
}
상속받은 부모의 메소드를 자식 클래스의 용도에 맞게 '재정의'하는 기술입니다.
class Printer {
void print() { System.out.println("기본 인쇄 모드"); }
}
class ColorPrinter extends Printer {
@Override
void print() {
// 부모의 동작을 완전히 대체
System.out.println("컬러 인쇄 모드");
}
}
| 상세 항목 | 오버로딩 (Overloading) | 오버라이딩 (Overriding) |
|---|---|---|
| 핵심 목적 | 메소드 호출 시의 편의성 제공 | 부모 클래스 기능의 다변화 |
| 바인딩 시점 | 컴파일 타임 (Static) | 런타임 (Dynamic) |
| 매개변수 | 반드시 다름 | 반드시 같음 |
| 반환 타입 | 영향 없음 (같든 다르든 상관없음) | 반드시 같음 |
| 예외 던지기 | 상관 없음 | 부모보다 더 큰 예외 불가 |
| 접근 제어자 | 상관 없음 | 부모보다 좁은 범위 불가 |
JVM은 오버라이딩을 효율적으로 처리하기 위해 내부적으로 Virtual Method Table(vtable)을 사용합니다.