Backend/Java
오버라이딩(Overriding)과 오버로딩(Overloading)의 차이
chillmyh
2025. 6. 6. 16:25

0. 들어가며
객체지향 프로그래밍을 하다 보면 반드시 마주치는 개념이 바로 오버라이딩(Overriding)과 오버로딩(Overloading)이다.
두 개념은 이름은 비슷하지만, 의미도 다르고 쓰임새도 완전히 다르다.
이번 글에서는 그 차이를 기술적인 관점에서 명확하게 정리해보자.
1. 오버라이딩 (Overriding)
오버라이딩은 "상속 관계에서 부모 클래스의 메서드를 재정의하는 것"이다.
즉, 자식 클래스가 부모로부터 상속받은 메서드를 동일한 시그니처로 다시 구현하여 동작을 바꾸는 것이다.
조건
- 메서드 이름, 매개변수, 리턴 타입 모두 동일해야 함
- 접근 제어자는 더 좁게 만들 수 없음 (확장 가능은 함)
- 상속 관계가 있어야 함
- @Override 애노테이션을 붙이는 것이 권장됨 (컴파일 타임 확인 가능)
// 예시
class Animal {
void speak() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Dog extends Animal {
@Override
void speak() {
System.out.println("멍멍!");
}
}
이 경우, Dog 클래스는 Animal의 speak() 메서드를 오버라이딩했다.
런타임 시 실제 객체 타입에 따라 메서드가 호출된다. (다형성)
2. 오버로딩 (Overloading)
오버로딩은 "같은 이름의 메서드를 매개변수만 다르게 하여 여러 개 정의하는 것"이다.
즉, 같은 클래스 안에서 이름은 같지만 시그니처가 다른 메서드를 여러 개 만드는 것이다.
조건
- 메서드 이름은 같아야 함
- 매개변수의 개수 or 타입 or 순서가 달라야 함
- 리턴 타입은 달라도 되지만, 오버로딩 판별 기준이 되지는 않음
- 같은 클래스 내에서만 가능 (상속과 무관)
// 예시
class Calculator {
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
}
이 경우, add()는 세 가지 시그니처로 오버로딩되었다.
컴파일 타임에 호출할 메서드가 결정된다.
3. 정리
항목 | 오버라이딩 (Overriding) | 오버로딩 (Overloading) |
정의 위치 | 상속받은 메서드를 자식 클래스에서 재정의 | 같은 클래스 안에서 같은 이름으로 정의 |
메서드 이름 | 같아야 함 | 같아야 함 |
매개변수 시그니처 | 동일해야 함 | 달라야 함 |
리턴 타입 | 동일 or 하위 타입 | 자유 (단, 구분 기준은 아님) |
실행 시점 | 런타임 결정 (다형성) | 컴파일 타임 결정 |
주요 목적 | 부모의 동작을 자식이 재정의 | 다양한 인자 타입 처리 |
Overriding은 상속과 다형성의 핵심,
Overloading은 편의성과 API 확장성의 핵심이다.
둘은 이름이 비슷하지만 개념도, 목적도, 적용 시점도 다르기 때문에
헷갈리지 않고 정확히 구분해서 사용하는 것이 중요하다.