본문 바로가기
Language/Java

[JAVA] 메서드 오버라이딩 vs 오버로딩 : 자바 다형성의 두 얼굴 완벽 가이드

by Papa Martino V 2026. 1. 15.
728x90

오버라이딩 vs 오버로딩
오버라이딩 vs 오버로딩

 

자바(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