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

1. 오버로딩 (Overloading): 과적하기

"같은 이름의 함수를 여러 개 만드는 것"입니다. 트럭에 짐을 많이 싣는(Overload) 것처럼, 하나의 이름에 여러 기능을 껴 넣는다고 생각하세요.

  • 핵심 : 이름은 같지만, 매개변수(개수나 타입)가 달라야 함.
  • 비유 : 식당의 '주문하기' 기능. 주문하기라는 함수(메서드)는 같지만 매개변수인 메뉴명, 수량, 옵션이 다름.
    주문하기(메뉴명) -> "김치찌개 하나요!"
    주문하기(메뉴명, 수량) -> "김치찌개 세 개요!"
    주문하기(메뉴명, 옵션) -> "김치찌개 맵게 하나요!"
  • 목적 : 같은 성격의 기능을 이름 하나로 편하게 쓰기 위해 사용합니다.

2. 오버라이딩 (Overriding): 덮어쓰기

"부모에게 물려받은 기능을 내 식으로 재정의하는 것"입니다. 기존의 것을 무시하고 그 위에 올라타서(Override) 새로운 내용을 쓰는 것이죠.

  • 핵심 : 이름, 매개변수, 결과 타입이 부모의 것과 완전히 똑같아야 함. (내용물만 바꿈)
  • 비유 : 가업 잇기
    부모 클래스 (요리사): 요리하다() -> "평범한 라면을 끓인다."
    자식 클래스 (스타 요리사): 요리하다() -> "트러플 오일을 넣은 고급 라면을 끓인다."
  • 목적 : 상속받은 기능을 자식 클래스에 맞게 바꾸기 위해 사용합니다.

3. 한눈에 비교하기

구분 오버로딩 (Overloading) 오버라이딩 (Overriding)
핵심 키워드 확장 / 다양화 재정의 / 교체
관계 한 클래스 내부 부모-자식 클래스 간 (상속)
메서드 이름 동일함 동일함
매개변수 반드시 달라야 함 반드시 같아야 함
리턴 타입 상관없음 반드시 같아야 함

4. 오버로딩 (Overloading) 예제

오버로딩은 한 클래스 안에서 매개변수 조합만 바꿔서 여러 기능을 만드는 것입니다.

class Calculator {
    // 1. 정수 두 개를 더하는 메서드
    int add(int a, int b) {
        return a + b;
    }

    // 2. 매개변수의 개수가 다른 경우 (오버로딩)
    int add(int a, int b, int c) {
        return a + b + c;
    }

    // 3. 매개변수의 타입이 다른 경우 (오버로딩)
    double add(double a, double b) {
        return a + b;
    }
}

핵심 : add라는 이름은 같지만, 입력받는 값(int, double, 개수 등)에 따라 자바가 알아서 적절한 메서드를 골라 실행합니다.

5. 오버라이딩 (Overriding) 예제

오버라이딩은 부모의 메서드를 자식이 그대로 가져와서 내용(Body)만 싹 바꾸는 것입니다.

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

class Dog extends Animal {
    // 부모의 메서드를 재정의 (오버라이딩)
    @Override // 이 어노테이션은 "부모 걸 덮어쓰고 있어요!"라고 알려주는 표시입니다.
    void makeSound() {
        System.out.println("멍멍! 짖습니다.");
    }
}

class Cat extends Animal {
    @Override
    void makeSound() {
        System.out.println("야옹~ 우네요.");
    }
}

핵심 : Dog나 Cat 객체에서 makeSound()를 호출하면, 부모의 "소리를 냅니다"가 아니라 자신이 덮어쓴 "멍멍"이나 "야옹"이 출력됩니다.

6. 한 번에 사용하는 모습

실제로 어떻게 동작하는지 메인 메서드에서 확인해 볼까요?

public class Main {
    public static void main(String[] args) {
        // 오버로딩 테스트
        Calculator cal = new Calculator();
        System.out.println(cal.add(5, 10));         // 15
        System.out.println(cal.add(1.2, 3.4));      // 4.6

        // 오버라이딩 테스트
        Animal myDog = new Dog(); 
        myDog.makeSound(); // 출력: 멍멍! 짖습니다. (부모 타입이지만 자식 기능이 실행됨)
    }
}

💡 주의할 점 (복습)
오버로딩에서 만약 이름과 매개변수는 똑같은데 리턴 타입(int vs double)만 다르게 만들면 어떻게 될까요? 자바는 "어떤 걸 써야 할지 모르겠어!"라며 컴파일 에러를 냅니다. 반드시 매개변수 구성이 달라야 해요. 오버라이딩을 할 때는 @Override라는 글자를 써주는 게 좋습니다. 실수로 매개변수를 하나 더 넣어서 오버로딩이 되어버리는 사고를 방지해주거든요.

 

추가적인 읽을거리 : https://hyoje420.tistory.com/14