Backend/Java

오버라이딩(Overriding)과 오버로딩(Overloading)의 차이

chillmyh 2025. 6. 6. 16:25

0. 들어가며

객체지향 프로그래밍을 하다 보면 반드시 마주치는 개념이 바로 오버라이딩(Overriding)과 오버로딩(Overloading)이다.
두 개념은 이름은 비슷하지만, 의미도 다르고 쓰임새도 완전히 다르다.
이번 글에서는 그 차이를 기술적인 관점에서 명확하게 정리해보자.

 

1. 오버라이딩 (Overriding)

오버라이딩은 "상속 관계에서 부모 클래스의 메서드를 재정의하는 것"이다.

즉, 자식 클래스가 부모로부터 상속받은 메서드를 동일한 시그니처로 다시 구현하여 동작을 바꾸는 것이다.

 

조건

 

  • 메서드 이름, 매개변수, 리턴 타입 모두 동일해야 함
  • 접근 제어자는 더 좁게 만들 수 없음 (확장 가능은 함)
  • 상속 관계가 있어야 함
  • @Override 애노테이션을 붙이는 것이 권장됨 (컴파일 타임 확인 가능)
// 예시

class Animal {
    void speak() {
        System.out.println("동물이 소리를 냅니다.");
    }
}

class Dog extends Animal {
    @Override
    void speak() {
        System.out.println("멍멍!");
    }
}

 

 

이 경우, Dog 클래스는 Animal의 speak() 메서드를 오버라이딩했다.

런타임 시 실제 객체 타입에 따라 메서드가 호출된다. (다형성)

 

2. 오버로딩 (Overloading)

오버로딩은 "같은 이름의 메서드를 매개변수만 다르게 하여 여러 개 정의하는 것"이다.

즉, 같은 클래스 안에서 이름은 같지만 시그니처가 다른 메서드를 여러 개 만드는 것이다.

 

조건

 

  • 메서드 이름은 같아야 함
  • 매개변수의 개수 or 타입 or 순서가 달라야 함
  • 리턴 타입은 달라도 되지만, 오버로딩 판별 기준이 되지는 않음
  • 같은 클래스 내에서만 가능 (상속과 무관)
// 예시

class Calculator {
    int add(int a, int b) {
        return a + b;
    }

    double add(double a, double b) {
        return a + b;
    }

    int add(int a, int b, int c) {
        return a + b + c;
    }
}

 

 

이 경우, add()는 세 가지 시그니처로 오버로딩되었다.

컴파일 타임에 호출할 메서드가 결정된다.

 

3. 정리

항목 오버라이딩 (Overriding) 오버로딩 (Overloading)
정의 위치 상속받은 메서드를 자식 클래스에서 재정의 같은 클래스 안에서 같은 이름으로 정의
메서드 이름 같아야 함 같아야 함
매개변수 시그니처 동일해야 함 달라야 함
리턴 타입 동일 or 하위 타입 자유 (단, 구분 기준은 아님)
실행 시점 런타임 결정 (다형성) 컴파일 타임 결정
주요 목적 부모의 동작을 자식이 재정의 다양한 인자 타입 처리

 

Overriding은 상속과 다형성의 핵심,
Overloading은 편의성과 API 확장성의 핵심이다.

 

둘은 이름이 비슷하지만 개념도, 목적도, 적용 시점도 다르기 때문에
헷갈리지 않고 정확히 구분해서 사용하는 것이 중요하다.