Java 오버라이딩(Overriding) vs 오버로딩(Overloading) 완벽 이해하기
Java 객체지향 프로그래밍(OOP)을 배우다 보면 매우 자주 헷갈리는 개념이 바로:
- 오버라이딩(Overriding)
- 오버로딩(Overloading)
입니다.
이름도 비슷하고 둘 다:
메서드 여러 개 만들기
처럼 보이기 때문에 초보 시절에 많이 혼동합니다.
하지만 실제로는:
- 동작 방식
- JVM 처리 방식
- 메모리 구조
- 다형성과의 관계
가 완전히 다릅니다.
실무에서도:
- Spring
- Collection Framework
- API 설계
- Builder 패턴
등 거의 모든 곳에서 사용됩니다.
이번 글에서는:
- 오버라이딩과 오버로딩 차이
- JVM 메서드 디스패치
- 정적 바인딩 vs 동적 바인딩
- 실무 사용 패턴
- 자주 하는 실수
까지 정리해보겠습니다.
1. 오버라이딩(Overriding)이란?
오버라이딩은:
부모 클래스의 메서드를 자식 클래스가 재정의하는 것
입니다.
예시:
class Animal {
void sound() {
System.out.println("동물");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍");
}
}
2. 오버라이딩 목적
핵심 목적:
다형성 구현
입니다.
즉:
- 부모 타입으로
- 다양한 자식 동작 수행 가능
하게 만드는 핵심 기술.
3. 오버라이딩 실행 결과
Animal animal = new Dog();
animal.sound();
결과:
멍멍
출력.
왜냐하면:
실제 객체는 Dog
이기 때문.
4. JVM 관점: 동적 바인딩
오버라이딩은:
실행 시점(runtime)에 메서드 결정
됩니다.
즉:
컴파일:
Animal 타입 확인
실행:
Dog 메서드 호출
구조.
이를:
Dynamic Dispatch
또는:
동적 바인딩
이라고 부릅니다.
5. 오버라이딩 조건
| 메서드 이름 동일 | 필수 |
| 매개변수 동일 | 필수 |
| 반환 타입 동일/하위 | 가능 |
6. 접근제어자 규칙
오버라이딩 시:
접근 범위 축소 불가
예:
public -> private
불가능.
7. final 메서드는 오버라이딩 불가
final void hello()
재정의 금지.
왜냐하면:
핵심 로직 보호
목적.
8. static 메서드는 오버라이딩 아님
매우 중요합니다.
class Parent {
static void hello() {}
}
class Child extends Parent {
static void hello() {}
}
이건 실제로:
Method Hiding
입니다.
9. static 메서드 실행 기준
Parent p = new Child();
p.hello();
결과:
Parent 메서드 호출
왜냐하면:
static은 참조 변수 타입 기준
으로 동작.
즉 다형성 적용 안 됨.
10. 오버로딩(Overloading)이란?
오버로딩은:
같은 이름 메서드를 여러 개 정의하는 것
입니다.
예시:
class Calculator {
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
}
11. 오버로딩 목적
핵심 목적:
같은 기능을 다양한 입력 형태 지원
입니다.
12. 오버로딩 조건
아래 중 하나 달라야 함.
| 매개변수 타입 | O |
| 매개변수 개수 | O |
| 매개변수 순서 | O |
13. 반환 타입만 다르면 불가능
int test()
double test()
불가능.
왜냐하면 JVM은:
메서드 이름 + 매개변수
로 메서드 구분하기 때문.
14. JVM 관점: 정적 바인딩
오버로딩은:
컴파일 시점에 메서드 결정
됩니다.
즉:
컴파일러가
매개변수 기준 메서드 선택
합니다.
이를:
Static Binding
또는:
정적 디스패치
라고 부릅니다.
15. 오버로딩 예시
void print(int x)
void print(String x)
호출:
print(10);
컴파일 시 이미 메서드 결정.
16. 오버라이딩 vs 오버로딩 핵심 차이
| 목적 | 다형성 | 편의성 |
| 위치 | 상속 관계 | 같은 클래스 가능 |
| 결정 시점 | 런타임 | 컴파일 |
| 바인딩 | 동적 | 정적 |
17. 오버라이딩과 다형성 관계
오버라이딩은:
다형성 핵심 기술
입니다.
왜냐하면:
Animal animal = new Dog();
같은 구조에서:
실제 객체 메서드 실행
가능하게 만들기 때문.
18. 실무에서 오버로딩 많이 쓰는 사례
대표 사례:
println()
println(int)
println(String)
println(double)
등 매우 많은 오버로딩 제공.
19. 생성자 오버로딩
실무에서 매우 많이 사용.
User()
User(String name)
User(String name, int age)
20. this()와 생성자 오버로딩
this(name, 0);
중복 제거 가능.
21. 오버라이딩과 super
super.method()
사용 시:
- 부모 기능 재사용
- 기능 확장 가능.
22. 실무에서 오버라이딩 사용하는 대표 사례
Spring
@ControllerAdvice
ExceptionHandler
JPA
toString()
equals()
hashCode()
Collection Framework
ArrayList.add()
LinkedList.add()
모두 오버라이딩 기반.
23. 실무에서 자주 하는 실수
1) @Override 안 쓰기
오타 발생 가능.
soud()
같은 버그 발생 가능.
24. 오버로딩 과도 사용
test()
test(int)
test(String)
test(int, String)
test(String, int)
너무 많으면 가독성 저하.
25. 상속 없이 오버라이딩 착각
오버라이딩은 반드시:
상속 관계 필요
합니다.
26. 변수는 오버라이딩 안 됨
매우 중요.
Parent.value
Child.value
는:
Variable Hiding
입니다.
메서드와 다름.
27. 오버라이딩과 LSP
객체지향 원칙 중:
Liskov Substitution Principle
과 연결.
즉:
부모 타입 자리에
자식 객체 안전하게 사용 가능해야 함
원칙.
28. 실무 설계 핵심
좋은 설계는:
인터페이스 + 오버라이딩
구조를 많이 사용.
즉:
- 구현 교체 가능
- 테스트 쉬움
- 확장성 높음
장점.
29. 오버라이딩/오버로딩 진짜 차이 요약
오버라이딩
다형성 구현
오버로딩
사용 편의성 제공
30. 정리
오버라이딩(Overriding)과 오버로딩(Overloading)은 이름은 비슷하지만 완전히 다른 개념입니다.
실제로는:
- JVM 메서드 디스패치
- 다형성
- 정적/동적 바인딩
- 객체지향 설계
와 깊게 연결됩니다.
특히 실무에서는:
- @Override 활용
- 인터페이스 기반 오버라이딩
- 생성자 오버로딩
- 다형성 설계
를 이해하는 것이 매우 중요합니다.
다음 글에서는:
객체지향 설계 원칙 SOLID
를 Spring 구조와 실무 설계 사례까지 포함해서 정리해보겠습니다.
'language > java' 카테고리의 다른 글
| Java 불변 객체(Immutable Object) 완벽 이해하기 (0) | 2026.05.22 |
|---|---|
| 객체지향 설계 원칙 SOLID 완벽 이해하기 (0) | 2026.05.22 |
| Java this / super 키워드 완벽 이해하기 (0) | 2026.05.22 |
| Java 접근 제어자(private/protected/public/default) 완벽 이해하기 (0) | 2026.05.22 |
| Java 추상 클래스(Abstract Class) vs 인터페이스(Interface) 완벽 이해하기 (0) | 2026.05.22 |
댓글