CS

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

Twisted 2025. 2. 25. 00:53

객체지향 프로그래밍(OOP)에서 자주 등장하는 개념 중 하나가 오버로딩과 오버라이딩이다.

두 개념은 이름이 비슷해서 헷갈리기 쉬운데 개념적으로 큰 차이가 있다. 이번에는 오버로딩과 오버라이딩의 차이를 명확하게 이해하는 시간을 가져보도록 하겠다.

 

오버로딩(Overloading)이란?

오버로딩은 같은 이름의 메서드를 여러 개 정의할 수 있도록 하는 기능이다.

단, 매개변수의 개수 또는 타입이 달라야한다. 즉, 같은 이름을 가진 메서드라도 전달하는 인자가 다르면 서로 다른 메서드로 취급된다는 소리이다.

 

오버로딩의 특징

  • 같은 클래스 내에서 메서드 이름을 동일하게 정의할 수 있다.
  • 매개변수의 개수, 타입, 순서가 다를 경우 허용된다.
  • 반환 타입은 오버로딩과 관계가 없다.
  •  
class MathUtils {
    // 두 개의 정수를 더하는 메서드
    int add(int a, int b) {
        return a + b;
    }
    
    // 세 개의 정수를 더하는 메서드 (오버로딩)
    int add(int a, int b, int c) {
        return a + b + c;
    }
    
    // 두 개의 실수를 더하는 메서드 (오버로딩)
    double add(double a, double b) {
        return a + b;
    }
}

add라는 이름의 메서드가 총 3개가 존재하지만, 매개변수의 개수와 타입이 다르기 때문에 이는 모두 다르게 작동한다. 이러한 것을 오버로딩이라 한다.

 

 

오버라이딩(Overriding)이란?

오버라이딩은 부모 클래스의 메서드를 자식 클래스에서 재정의하는 기능이다.

상속 관계에서만 발생하며, 부모 클래스의 메서드를 그대로 사용할 수도 있지만, 자식 클래스에서 해당 메서드의 내용을 변경하여 사용할 수 있도록 한다.

 

오버라이딩의 특징

  • 반드시 상속 관계에서 발생
  • 메서드 이름, 매개변수의 개수 및 타입이 부모 클래스와 완전히 동일해야한다.
  • 반환 타입이 부모 클래스와 같거나, 자식 타입일 수 있다.
  • 접근 제어자는 부모 클래스보다 더 좁게 설정할 수 없다.
  • @Override 어노테이션을 사용하여 오버라이딩을 명확히 할 수 있다.
class Animal {
    void sound() {
        System.out.println("동물이 소리를 냅니다.");
    }
}

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

public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Animal();
        myAnimal.sound(); // 동물이 소리를 냅니다.

        Dog myDog = new Dog();
        myDog.sound(); // 멍멍!
    }
}

Dog클래스는 Animal클래스를 상속받고, sound메서드를 오버라이딩하여 새로운 동작을 재정의하였다.

이러한 것을 오버라이딩이라고 한다.

 

Overloading vs Overriding

 

결론

  • 오버로딩은 동일한 이름의 메서드를 매개변수만 다르게 여러 개 정의하는 것
  • 오버라이딩은 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것