본문 바로가기
카테고리 없음

오버로딩과 오버라이딩의 차이점

by 개발초보입니다 2023. 12. 20.

오버로딩과 오버라이딩

오버로딩(Overloading)과 오버라이딩(Overriding)은 객체 지향 프로그래밍에서 중요한 개념으로, 메서드의 다형성을 구현하는데 사용됩니다.


오버로딩

오버로딩(Overloading)은 객체 지향 프로그래밍에서 사용되는 개념 중 하나로, 같은 이름의 메서드를 여러 개 정의하는 것을 말합니다.

다만, 각각의 메서드는 서로 다른 매개변수의 개수나 타입을 가져야 합니다. 이를 통해 같은 이름의 메서드를 다양한 상황에 맞게 사용할 수 있게 됩니다.

 

오버로딩을 사용하면 같은 동작을 하는 메서드들을 하나의 이름으로 통일 할 수 있으며, 코드의 가독성을 높일 수 있습니다. 또한, 사용자는 메서드의 이름만으로 어떤 기능을 하는지 예측할 수 있어 편리합니다.


오버로딩의 특징

  • 메서드 이름 동일: 오버로딩 된 메서드들은 모두 같은 이름을 가집니다.
  • 매개변수 다양성: 같은 이름의 메서드이지만, 매개변수의 개수나 타입이 서로 달라야 합니다.
  • 반환 타입 무관: 반환 타입은 오버로딩에 영향을 미치지 않습니다. 매개변수의 타입과 개수만 다르면 됩니다.

예시 코드

public 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;
    }
}

public class Main {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();

        System.out.println(calculator.add(3, 4));           // 정수형 덧셈 호출
        System.out.println(calculator.add(2.5, 3.5));       // 실수형 덧셈 호출
        System.out.println(calculator.add(1, 2, 3));        // 세 개의 정수 덧셈 호출
    }
}

 

위의 예제에서는 Calculator 클래스는 add라는 메서드를 오버로딩하여 정수형 덧셈, 실수형 덧셈, 그리고 세 개의 정수를 더하는 버전으로 세 가지 형태의 메서드를 가지고 있습니다. 이렇게 오버로딩을 통해 다양한 상황에서 유연하게 메서드를 사용할 수 있습니다.


오버라이딩

오버라이딩(Overriding)은 객체 지향 프로그래밍에서 부모 클래스에서 이미 정의된 메서드를 자식 클래스에서 동일한 시그니처(메서드 이름, 매개변수, 반환 타입)로 다시 정의하는 것을 말합니다. 이로써 자식 클래스에서 부모 클래스의 동일한 이름을 가진 메서드를 재정의하여 자신의 필요에 맞게 구현할 수 있습니다.

 

오버라이딩은 다형성의 한 형태로, 같은 메서드 호출에 대해 다른 동작을 수행하도록 합니다. 이를 통해 프로그램은 런타임 시에 객체의 실제 타입을 기반으로 적절한 메서드를 호출합니다.


오버라이딩의 특징

  • 메서드 이름과 시그니처 동일: 오버라이딩 된 메서드는 부모 클래스의 메서드와 동일한 이름과 시그니처(매개변수의 개수와 타입, 반환 타입)를 가져야 합니다.
  • 상속 관계 필요: 오버라이딩은 부모 클래스와 자식 클래스 간에만 발생합니다. 부모 클래스에서 상속된 메서드를 자식 클래스에서 재정의 하는 것이기 떄문입니다.
  • 메서드 재정의: 자식 클래스에서 부모클래스의 메서드를 재정의 하여 자식클래스의 동작으로 변경할 수 있습니다.

예시 코드

class Animal {
    void makeSound() {
        System.out.println("동물소리");
    }
}

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

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog(); // 부모 클래스 타입으로 자식 클래스 객체 생성
        animal.makeSound(); // Dog 클래스의 makeSound()이 호출됨
    }
}

 

위의 예제에서 Animal클래스의 makeSound 메서드는 어떤 동물의 소리를 출력하는 기본 동작을 가지고 있습니다. 

그런데 Dog 클래스에서는 makeSound 메서드를 오버라이딩하여 개의 짖는 소리로 변경하였습니다.

런타입 시에 Dog 클래스의 오버라이딩 된 메서드가 호출되므로 멍! 멍!이 출력됩니다.


차이점

1. 정의 위치

  • 오버로딩: 한 클래스 내에서 동일한 메서드 이름을 가지면서 매개변수의 개수나 타입을 다르게 정의하는 것입니다. 즉, 같은 클래스 내에서 메서드 이름이 동일하면서 시그니처가 다른 메서드를 여러개 정의하는 것입니다.
  • 오버라이딩: 부모 클래스에서 이미 정의된 메서드를 자식 클래스에서 동일한 시그니처로 다시 정의하는 것입니다. 즉, 상속 관계에서 부모 클래스의 메서드를 자식 클래스에서 재정의 하는 것입니다.

2. 적용 범위

  • 오버로딩: 한 클래스 내에서 발생합니다.
  • 오버라이딩: 부모 클래스와 자식 클래스 간에 발생합니다.

3. 메서드 시그니처

  • 오버로딩: 메서드 이름은 동일하나, 매개변수의 개수나 타입이 서로 다릅니다.
  • 오버라이딩: 메서드 이름, 매개변수의 개수와 타입, 반환 타입이 부모클래스와 자식 클래스에서 동일합니다.

4. 관련 클래스

  • 오버로딩: 한 클래스 내에서 동작하며, 같은 이름의 메서드를 다양한 매개변수로 정의합니다.
  • 오버라이딩: 부모 클래스와 자식 클래스 간에 동작하며, 부모 클래스의 메서드를 자식 클래스에서 재정의 합니다.

오버로딩은 한 클래스 내에서 다양한 매개변수로 메서드를 정의하는 것이며, 오버라이딩은 상속 관계에서 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것입니다.