Dev/Java

오버로딩과 오버라이딩

Anews 2024. 10. 10. 13:24

오버로딩(Overloading)

오버로딩은 같은 이름의 메서드를 다른 매개변수로 정의하는 것을 말한다.

하나의 클래스 내에서 메서드 이름은 동일하지만, 매개변수의 개수나 타입을 다르게 하여 여러 메서드를 정의할 수 있다.

오버로딩은 컴파일 시점에 결정된다.

 

< 예시 >

class Calculator {
    // 두 정수를 더하는 메서드
    public int add(int a, int b) {
        return a + b;
    }
    
    // 세 정수를 더하는 메서드 (오버로딩)
    public int add(int a, int b, int c) {
        return a + b + c;
    }
    
    // 두 실수를 더하는 메서드 (오버로딩)
    public double add(double a, double b) {
        return a + b;
    }
}

위 예시에서 add 메서드는 3가지 버전으로 오버로딩되어 있다.

매개변수의 타입과 개수가 달라서 호출하는 시점에 적절한 메서드가 선택된다.

 

1. add(3, 4) -> 두 개의 정수를 더하는 첫 번째 메서드 호출

2. add(1, 2, 3) -> 세 개의 정수를 더하는 두 번째 메서드 호출

3. add(1.5, 2.5) -> 두 개의 실수를 더하는 세 번째 메서드 호출


오버라이딩(Overriding)

오버라이딩은 부모 클래스에서 정의된 메서드를 자식 클래스에서 재정의하는 것을 의미한다.

메서드의 이름, 매개변수, 리턴타입 모두 동일하지만 자식 클래스에서 메서드의 동작을 다르게 구현할 수 있다.

오버라이딩은 런타임 시점에 결정된다.

< 예시 >

class Animal {
    // 부모 클래스의 메서드
    public void sound() {
        System.out.println("동물이 소리를 냅니다.");
    }
}

class Dog extends Animal {
    // 부모 클래스의 sound 메서드를 오버라이딩
    @Override
    public void sound() {
        System.out.println("강아지가 멍멍 짖습니다.");
    }
}

class Cat extends Animal {
    // 부모 클래스의 sound 메서드를 오버라이딩
    @Override
    public void sound() {
        System.out.println("고양이가 야옹 야옹 합니다.");
    }
}

위 예시에서 Dog와 Cat 클래스는 부모 클래스인 Animal의 sound 메서드를 오버라이딩하고 있다.

따라서 Dog, Cat 객체에서 sound 메서드를 호출할 때, 부모 클래스의 메서드가 아니라 각각 오버라이딩된 메서드가 실행 된다.

 

< 실행 예시 >

Animal myDog = new Dog();
myDog.sound(); // 출력 결과 -> "강아지가 멍멍 짖습니다."

Animal myCat = new Cat();
myCat.sound(); // 출력 결과 -> "고양이가 야옹 야옹 합니다."

차이점 요약

구분 오버로딩(Overloading) 오버라이딩(Overrading)
정의 같은 이름의 메서드를 다른 매개변수로
여러 개 정의하는 것
부모 클래스의 메서드를 자식 클래스에서
재정의 하는 것
결정 시점 컴파일 시점 런타임 시점
상속 관계 상속과 관계 없음 상속 관계에서만 발생
메서드 이름 동일 동일
매개변수 달라야 함 동일해야 함
용도 같은 기능을 하는 메서드를 다양한 방법으로
호출 하고자 할 때
부모 클래스의 동작을 자식 클래스에서
다르게 구현 하고자 할 때
오버로딩은 메서드의 다양한 사용방법을 제공하고,
오버라이딩상속된 기능을 재정의해서
객체의 특성에 맞게 동작을 변경하는 데 사용된다.