728x90

자바(Java)를 배우다 보면 가장 먼저 마주치는 고비이자, 면접 단골 질문 중 하나가 바로 오버라이딩(Overriding)과 오버로딩(Overloading)입니다. 이름은 비슷하지만, 이 둘은 자바의 핵심 철학인 '다형성'을 구현하는 완전히 다른 방식입니다. 단순히 암기하는 것이 아니라, 왜 이 기능들이 필요한지 그리고 실무에서 어떤 설계적 이점을 주는지 전문적인 시각에서 분석해 보겠습니다.
1. 메서드 오버로딩(Method Overloading): '확장'의 개념
오버로딩은 한 클래스 내에서 동일한 이름의 메서드를 여러 개 정의하는 것입니다. 단, 매개변수의 타입, 개수, 순서 중 하나는 반드시 달라야 합니다.
왜 사용하는가?
- 기억의 편의성: '더하기' 기능을 수행하는 메서드를
addInt,addDouble로 나누지 않고 모두add로 통일할 수 있습니다. - 유연한 API 설계: 사용자가 인자를 하나만 넣든, 세 개를 넣든 동일한 기능을 수행하도록 배려할 수 있습니다.
2. 메서드 오버라이딩(Method Overriding): '재정의'의 개념
오버라이딩은 상속 관계에 있는 부모 클래스의 메서드를 자식 클래스에서 자신에 맞게 내용을 바꾸는 것입니다. 이름, 매개변수, 반환 타입이 부모의 것과 완전히 일치해야 합니다.
왜 사용하는가?
- 런타임 다형성: 부모 타입의 참조 변수로 자식 객체의 메서드를 호출할 때, 실제 인스턴스의 재정의된 메서드가 실행되게 함으로써 유연한 코드를 작성합니다.
- 기능의 특수화: 공통된 기능(예:
move())을 상속받되, '새는 날고, 물고기는 헤엄친다'는 구체적인 동작을 구현할 수 있습니다.
3. 오버라이딩 vs 오버로딩 결정적 차이점 요약
두 개념의 차이를 기술적 요구 사항에 따라 표로 정리하였습니다.
| 구분 | 오버로딩 (Overloading) | 오버라이딩 (Overriding) |
|---|---|---|
| 핵심 정의 | 새로운 메서드 정의 (확장) | 상속받은 메서드 변경 (재정의) |
| 메서드 이름 | 동일해야 함 | 동일해야 함 |
| 매개변수 | 반드시 달라야 함 | 반드시 같아야 함 |
| 반환 타입 | 상관 없음 | 동일해야 함 (공변 반환 타입 제외) |
| 결정 시점 | 컴파일 타임 (정적 바인딩) | 런타임 (동적 바인딩) |
4. 실무자가 전하는 주의사항 (Tips)
- @Override 어노테이션 활용: 오버라이딩을 할 때는 반드시 어노테이션을 붙이세요. 실수로 이름을 틀렸을 때 컴파일러가 즉시 잡아줍니다.
- 접근 제어자: 오버라이딩 시 부모 메서드보다 좁은 범위의 접근 제어자로 변경할 수 없습니다. (예: 부모가
protected면 자식은private불가) - 정적 메서드(static):
static메서드는 오버라이딩 대상이 아닙니다. 이는 '하이딩(Hiding)'이라고 부르는 다른 개념입니다.
5. 결론
오버로딩은 편의성을 위해 존재하고, 오버라이딩은 객체 지향의 유연성(다형성)을 위해 존재합니다. 이 두 차이를 명확히 구분하여 사용하는 것은 단순히 문법을 아는 것을 넘어, '변경에 유연한 코드'를 짜는 숙련된 개발자로 가는 필수 관문입니다.
내용 출처 및 참고 문헌
- Oracle Java Documentation: Overriding and Hiding Methods
- James Gosling, The Java Programming Language, 4th Edition
728x90
'Language > Java' 카테고리의 다른 글
| [JAVA] 추상 클래스 vs 인터페이스 : 객체 지향 설계의 본질적 차이 분석 (0) | 2026.01.16 |
|---|---|
| [JAVA] 다형성(Polymorphism) 완벽 이해 : 객체 지향의 마법을 부리는 방법 (0) | 2026.01.15 |
| [JAVA] super와 super()의 완벽 분석: 부모 객체로 향하는 두 가지 통로 (0) | 2026.01.15 |
| [JAVA] Java 상속(Inheritance)을 사용하는 이유와 제한 사항: 효율적인 객체 지향 설계를 위한 가이드 (0) | 2026.01.15 |
| [JAVA] this와 this()의 결정적 차이: 자바 객체 지향의 Detail 완성하기 (0) | 2026.01.15 |