본문 바로가기
language/java

Java 오버라이딩(Overriding) vs 오버로딩(Overloading) 완벽 이해하기

by 죄니안죄니 2026. 5. 22.
반응형

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 구조와 실무 설계 사례까지 포함해서 정리해보겠습니다.

반응형

댓글