본문 바로가기
개발일지

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

by 윤승임 2023. 4. 5.

오버로딩(Overloading)

함수나 연산자 등의 이름을 동일하게 사용하면서 매개변수의 종류, 개수, 순서 등을 다르게 정의하는 것.

 

이는 프로그래머가 함수의 사용 방법을 좀 더 직관적으로 이해할 수 있도록 하며,
함수의 이름을 기억하고 호출하는 데 드는 어려움을 줄일 수 있다.

 

자바 컴파일러는 메소드를 호출할 때,
메소드의 이름과 전달하는 인자의 개수와 타입으로 어떤 메소드를 호출할지 결정하므로
같은 이름의 메소드라도 전달하는 인자의 개수와 타입에 따라 다른 메소드가 호출될 수 있다.

public class Calculator {
    // int형 매개변수를 받는 함수
    public int add(int a, int b) {
        return a + b;
    }

    // double형 매개변수를 받는 함수
    public double add(double a, double b) {
        return a + b;
    }

    // int형과 double형 매개변수를 받는 함수
    public double add(int a, double b) {
        return a + b;
    }

    // double형과 int형 매개변수를 받는 함수
    public double add(double a, int b) {
        return a + b;
    }

    public static void main(String[] args) {
        int num1 = 1, num2 = 2;
        double dnum1 = 1.5, dnum2 = 2.5;

        Calculator calc = new Calculator();

        // int형 매개변수를 받는 함수 호출
        System.out.println(calc.add(num1, num2));

        // double형 매개변수를 받는 함수 호출
        System.out.println(calc.add(dnum1, dnum2));

        // int형과 double형 매개변수를 받는 함수 호출
        System.out.println(calc.add(num1, dnum1));

        // double형과 int형 매개변수를 받는 함수 호출
        System.out.println(calc.add(dnum1, num1));
    }
}

오버라이딩

부모 클래스에 정의된 메소드를 자식 클래스에서 다시 정의하여 사용하는 것

 

자식 클래스에서 부모 클래스의 메소드를 오버라이딩하면,
자식 클래스에서는 부모 클래스의 메소드 대신 자식 클래스에서 정의한 메소드가 호출된다.

오버라이딩을 사용할 때는 부모 클래스와 자식 클래스 간의 메소드 시그니처가 동일해야 한다.
메소드의 이름, 매개변수의 개수, 타입, 순서 등이 부모 클래스와 자식 클래스에서 동일한 경우에만 오버라이딩이 가능하다.

class Animal {
    String name;

    // 생성자
    public Animal(String name) {
        this.name = name;
    }

    // 메소드
    public void makeSound() {
        System.out.println("The animal makes a sound.");
    }
}

class Dog extends Animal {
    // 생성자
    public Dog(String name) {
        super(name); // 부모 클래스의 생성자 호출
    }

    // 오버라이딩된 메소드
    @Override
    public void makeSound() {
        System.out.println("The dog barks.");
    }
}

makeSound 메소드가 오버라이딩되었기 때문에,
Dog 클래스에서 makeSound 메소드를 호출하면 Animal 클래스의 메소드가 아닌,
Dog 클래스에서 정의한 메소드가 호출된다.


둘의 차이점

오버로딩(Overloading)과 오버라이딩(Overriding)은 둘 다 자바에서 다형성을 구현하는 방법 중 하나이다.

 

오버로딩은 같은 이름의 메소드를 여러 개 정의하되,
매개변수의 개수, 타입, 순서 등을 다르게 하여
메소드를 호출할 때 전달하는 인수에 따라
적절한 메소드를 자동으로 선택하여 호출하는 것을 말한다.

예를 들어, print 메소드를 오버로딩하여 print(int x), print(double x), print(String s) 등을 정의할 수 있다.

 

오버라이딩은 상속 관계에 있는 두 클래스 간에 같은 이름의 메소드를 정의하되,
부모 클래스의 메소드를 자식 클래스에서 재정의하여 사용하는 것을 말한다.
오버라이딩을 할 때는 부모 클래스와 자식 클래스 간의 메소드 시그니처가 동일해야 하며,
자식 클래스에서 정의한 메소드가 호출된다.

 

따라서 오버로딩과 오버라이딩의 가장 큰 차이점은 메소드 시그니처가 같은지 다른지 여부다.