둘 다 메서드 이름을 재사용하지만 근본적으로 다릅니다. Overloading = 같은 이름, 다른 매개변수, 같은 class 내, 컴파일 타임에 해결. Overriding = 서브클래스가 부모 메서드를 같은 시그니처로 대체, 런타임에 해결.
둘 다 메서드 이름을 재사용하지만 근본적으로 다릅니다. Overloading = 같은 이름, 다른 매개변수, 같은 class 내, 컴파일 타임에 해결. Overriding = 서브클래스가 부모 메서드를 같은 시그니처로 대체, 런타임에 해결.
주니어부터 시니어까지 상세한 답변이 포함된 IT 면접 질문 라이브러리.
후원하기| Overloading | Overriding |
|---|
| 시그니처 | 달라야 함 (매개변수) | 동일해야 함 |
| 관계 | 같은 class | 부모 ↔ 서브클래스 |
| 해결 시점 | 컴파일 타임 (정적) | 런타임 (동적) |
| 목적 | 편의 / 변형 | Polymorphism |
class Printer {
void print(String s) { System.out.println(s); }
void print(int n) { System.out.println(n); } // 같은 이름, 다른 매개변수
void print(String s, int times) { /* ... */ }
}
컴파일러가 인자 타입에 기반하여 어떤 print를 사용할지 선택합니다 — inheritance는 관여하지 않습니다.
class Animal { String speak() { return "..."; } }
class Dog extends Animal {
@Override
String speak() { return "Woof"; } // Animal.speak() 를 대체
}
Animal a = new Dog();
a.speak(); // "Woof" — 런타임이 Dog 의 버전을 선택 (동적 디스패치)
흔한 실수는 override하려던 의도였는데 실수로 overloading하는 것입니다(예: 시그니처의 오타). 컴파일러가 잡아낼 수 있도록 항상 @Override(Java)나 override(C#)를 사용하세요.
Overriding은 polymorphism의 엔진입니다 — "하나의 인터페이스, 여러 구현"을 작동시키는 런타임 메커니즘입니다.
차이를 아는 것은 전형적인 버그를 방지합니다: 동작을 대체했다고 생각했지만 실제로는 결코 호출되지 않는 두 번째 메서드를 만든 경우 말입니다.