
자바(Java)에서 객체지향 프로그래밍을 다루다 보면 오버로딩(Overloading) 과 오버라이딩(Overriding) 개념을 자주 접하게 됩니다.
두 용어는 비슷해 보이지만 목적과 동작 시점이 완전히 다릅니다.
이번 글에서는 오버로딩과 오버라이딩의 차이와 사용법을 명확히 정리해보겠습니다.
1. 오버로딩(Overloading)과 오버라이딩(Overriding) 개념
| 구분 | 오버로딩 (Overloading) | 오버라이딩 (Overriding) |
| 의미 | 같은 이름의 메서드를 여러 개 정의 | 상속받은 메서드를 재정의 |
| 위치 | 같은 클래스 내 | 부모 클래스 - 자식 클래스 간 |
| 호출 시점 | 컴파일 시 결정 | 실행 시(Runtime) 결정 |
즉, 오버로딩은 메서드 이름은 같지만 매개변수가 다를 때 사용되고,
오버라이딩은 상속받은 메서드의 동작을 바꿀 때 사용됩니다.
2. 자바 오버로딩(Overloading) 특징과 예제
오버로딩(Overloading) 은 동일한 메서드 이름으로 여러 기능을 제공하고 싶을 때 사용합니다.
컴파일 시점에 어떤 메서드가 호출될지 결정됩니다.
📘 예제 코드
public class Calculator {
// 정수 덧셈
int add(int a, int b) {
return a + b;
}
// 실수 덧셈
double add(double a, double b) {
return a + b;
}
}
📘 호출 예시
Calculator calc = new Calculator();
System.out.println(calc.add(5, 3)); // int 버전 호출
System.out.println(calc.add(2.5, 3.2)); // double 버전 호출
💡 매개변수의 타입, 개수, 순서가 다르면 오버로딩이 가능합니다.
단, 반환형만 다르고 매개변수가 동일하면 오버로딩 불가능합니다.
3. 자바 오버라이딩(Overriding) 특징과 예제
오버라이딩(Overriding) 은 상속 관계에서 부모 클래스의 메서드를 재정의하는 것입니다.
자식 클래스가 부모의 메서드를 그대로 사용하지 않고,
상황에 맞게 기능을 변경할 수 있습니다.
📘 예제 코드
class Animal {
void sound() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍!");
}
}
📘 호출 예시
Animal animal = new Dog();
animal.sound(); // 출력: 멍멍!
💡 @Override 어노테이션을 붙이면 컴파일러가 올바르게 재정의되었는지 확인합니다.
오버라이딩은 런타임에 동적으로 결정되는 다형성(Polymorphism) 의 핵심입니다.
4. 오버로딩 vs 오버라이딩 비교 표
| 항목 | 오버로딩 (Overloading) | 오버라이딩 (Overriding) |
| 적용 위치 | 같은 클래스 내 | 상속 관계 (부모–자식) |
| 목적 | 같은 기능의 다양한 형태 제공 | 상속된 기능의 재정의 |
| 결정 시점 | 컴파일 시 | 실행 시(Runtime) |
| 매개변수 | 반드시 다름 | 동일해야 함 |
| 어노테이션 | 사용하지 않음 | @Override 필수 권장 |
| 다형성 | 지원하지 않음 | 다형성 구현의 핵심 |
5. 실무에서의 활용 포인트
- 오버로딩은
- 유틸성 클래스나 계산기, 로깅(log) 메서드처럼
동일 기능을 다양한 입력 형태로 처리할 때 유용합니다.
- 유틸성 클래스나 계산기, 로깅(log) 메서드처럼
- 오버라이딩은
- 상속받은 클래스를 커스터마이징하거나
스프링(Spring) 같은 프레임워크에서 추상 메서드 구현, Bean 재정의 등에 자주 활용됩니다.
- 상속받은 클래스를 커스터마이징하거나
- 정리하면
- 오버로딩 → 컴파일러가 메서드를 구분
- 오버라이딩 → JVM이 실행 시점에 메서드를 결정
✅ 마무리
자바의 오버로딩과 오버라이딩은 이름은 비슷하지만 의미, 사용 위치, 동작 시점이 모두 다릅니다.
- 오버로딩: 같은 클래스에서 같은 이름의 메서드 여러 개 정의
- 오버라이딩: 상속받은 메서드의 기능 재정의
이 두 개념을 명확히 구분하면 코드의 확장성과 유지보수성을 크게 높일 수 있습니다.