티스토리 뷰
오버로딩과 오버라이딩, 이름은 비슷한데 뭐가 다를까?
Java를 공부하다 보면 오버로딩(Overloading) 과 오버라이딩(Overriding) 이 거의 항상 함께 등장합니다. 이름도 비슷하고 둘 다 메서드와 관련된 개념이라서 초보 단계에서는 쉽게 헷갈립니다.
하지만 두 개념은 목적부터 다릅니다.
- 오버로딩: 같은 이름의 메서드를 여러 방식으로 제공하는 것
- 오버라이딩: 부모 클래스의 메서드를 자식 클래스에서 다시 정의하는 것
이번 글에서는 두 개념의 차이를 정의 → 예제 → 비교 → 실무 포인트 흐름으로 깔끔하게 정리해보겠습니다.
1. 오버로딩(Overloading)이란?
오버로딩은 메서드 이름은 같지만 파라미터가 다른 메서드를 여러 개 정의하는 것입니다.
즉, 같은 기능을 비슷한 이름으로 묶어두고 입력값 형태에 따라 다른 메서드가 호출되도록 만드는 방식입니다.
오버로딩 예제
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
}
위 코드는 모두 add라는 같은 이름을 사용하지만, 파라미터의 개수와 타입이 다르기 때문에 서로 다른 메서드로 구분됩니다.
오버로딩의 핵심 기준
- 파라미터 개수가 다르다
- 파라미터 타입이 다르다
- 파라미터 순서가 다르다
반대로 리턴 타입만 다른 것은 오버로딩이 아닙니다.
// 컴파일 오류 발생
public int test(int a) { return a; }
public double test(int a) { return a; }
2. 오버라이딩(Overriding)이란?
오버라이딩은 부모 클래스의 메서드를 자식 클래스에서 같은 시그니처로 다시 정의하는 것입니다.
이 개념은 객체지향의 핵심인 다형성(Polymorphism) 과 직접 연결됩니다.
오버라이딩 예제
class Animal {
public void sound() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("멍멍");
}
}
여기서 Dog는 Animal의 sound() 메서드를 그대로 쓰지 않고, 자신의 역할에 맞게 다시 정의했습니다. 이것이 오버라이딩입니다.
오버라이딩의 핵심 기준
- 메서드 이름이 같아야 한다
- 파라미터가 같아야 한다
- 상속 관계가 있어야 한다
- 접근 제어자는 부모보다 더 좁아지면 안 된다
그리고 @Override 어노테이션을 붙이면 실수를 줄이는 데 도움이 됩니다.
3. 오버로딩과 오버라이딩 차이 정리
아래처럼 보면 두 개념의 차이가 훨씬 선명하게 보입니다.
|
오버로딩
같은 이름, 다른 입력
|
오버라이딩
부모 메서드 다시 정의
|
| 구분 | 오버로딩 | 오버라이딩 |
|---|---|---|
| 의미 | 같은 이름의 메서드를 여러 형태로 정의 | 부모 메서드를 자식이 다시 정의 |
| 관계 | 같은 클래스 안에서도 가능 | 상속 관계가 필요 |
| 기준 | 파라미터가 달라야 함 | 메서드 시그니처가 같아야 함 |
| 목적 | 사용 편의성 증가 | 다형성 구현 |
| 핵심 이미지 | 같은 이름, 다른 입력 | 부모 메서드 재정의 |
한 줄로 정리하면 아래처럼 기억하면 됩니다.
- 오버로딩 = 같은 이름, 다른 입력
- 오버라이딩 = 부모 메서드를 자식이 다시 구현
4. 헷갈리기 쉬운 포인트
4-1. 오버로딩은 상속이 없어도 된다
많은 초보자가 둘 다 상속이 필요하다고 생각하지만, 오버로딩은 같은 클래스 내부에서도 얼마든지 가능합니다.
public class Printer {
public void print(String text) {
System.out.println(text);
}
public void print(int number) {
System.out.println(number);
}
}
4-2. 오버라이딩은 리턴 타입만 바꾸는 개념이 아니다
오버라이딩은 단순히 반환값을 바꾸는 것이 아니라, 부모가 정의한 동작을 자식이 자신의 방식으로 다시 구성하는 것입니다.
4-3. static 메서드는 일반적인 오버라이딩과 다르게 본다
엄밀히 말하면 static 메서드는 오버라이딩보다는 숨김(hiding) 으로 보는 경우가 많습니다. 그래서 초보 단계에서는 우선 인스턴스 메서드 기준으로 오버라이딩을 이해하는 것이 좋습니다.
5. 실무에서는 언제 중요할까?
오버로딩이 중요한 경우
- 같은 기능을 다양한 입력값으로 제공하고 싶을 때
- API 사용성을 높이고 싶을 때
- 생성자를 여러 버전으로 만들고 싶을 때
예를 들어 println(), String.valueOf() 같은 메서드는 다양한 타입을 받을 수 있도록 오버로딩을 적극 활용합니다.
오버라이딩이 중요한 경우
- 공통 부모 클래스나 인터페이스를 기반으로 기능을 확장할 때
- 프레임워크 규약에 맞춰 동작을 재정의할 때
- 다형성을 활용해 유지보수성을 높이고 싶을 때
예를 들어 toString(), equals(), hashCode() 재정의는 오버라이딩의 대표적인 사례입니다.
결론
자바에서 오버로딩과 오버라이딩은 이름은 비슷하지만 역할은 분명히 다릅니다.
- 오버로딩은 같은 이름의 메서드를 다양한 입력 방식으로 제공하는 기술
- 오버라이딩은 상속받은 메서드를 자식 클래스의 역할에 맞게 다시 정의하는 기술
이 차이를 정확히 이해하면 메서드 설계, 객체지향 개념, 다형성 이해가 훨씬 쉬워집니다.
핵심 정리
- 오버로딩은 파라미터가 달라야 한다
- 오버라이딩은 상속 관계와 같은 시그니처가 필요하다
- 오버로딩은 사용 편의성에 가깝다
- 오버라이딩은 다형성 구현에 가깝다
헷갈릴 때는 이 문장 하나로 기억하면 됩니다.
오버로딩은 같은 이름, 다른 입력이고 오버라이딩은 부모 메서드 다시 정의입니다.
'IT > Java' 카테고리의 다른 글
| [Java] REST API란? 자바로 이해하는 RESTful 설계 원칙 (0) | 2026.03.19 |
|---|---|
| [Java] 객체지향 설계 5원칙 SOLID 쉽게 이해하기 (0) | 2026.03.19 |
| [Java] 에러(Error)와 예외 클래스(Exception) (0) | 2026.03.09 |
| [Java] 얕은 복사(Shallow Copy) vs 깊은 복사(Deep Copy) (0) | 2026.03.08 |
| [Java] 자바 객체 지향(OOP) (0) | 2026.03.07 |
