개발/자바

오버로딩(Overloading)과 오버라이딩(Overriding)의 차이점

피터JK 2025. 2. 20. 10:18
728x90

오버로딩(Overloading)과 오버라이딩(Overriding)의 차이점

구분 오버로딩(Overloading) 오버라이딩(Overriding)
정의 같은 이름의 메서드를 매개변수의 타입, 개수, 순서를 다르게 하여 여러 개 정의하는 것 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것
클래스 관계 같은 클래스 내에서 발생 상속 관계(부모-자식 클래스)에서 발생
메서드 이름 동일 동일
매개변수 다르게 정의 (타입, 개수, 순서) 동일해야 함
반환 타입 다를 수도 있음 부모 클래스와 동일해야 함 (JDK 5 이후에는 Covariant return type 허용)
접근 제한자 제한 없음 부모 클래스보다 더 강한 제한자는 사용 불가 (public → protected 가능, protected → private 불가)
사용 목적 같은 기능이지만 다른 방식으로 사용할 때 부모 클래스의 기능을 자식 클래스에서 변경할 때
컴파일 시점 체크 컴파일러가 메서드의 시그니처를 검사하여 결정 런타임 시 다형성으로 결정

📌 오버로딩(Overloading) 예제

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 OverloadingExample {
    public static void main(String[] args) {
        Calculator calc = new Calculator();
        System.out.println(calc.add(2, 3));        // 정수 덧셈
        System.out.println(calc.add(2.5, 3.5));    // 실수 덧셈
        System.out.println(calc.add(1, 2, 3));     // 정수 3개 덧셈
    }
}

🔹 오버로딩 특징

✔️ 메서드 이름이 동일하지만, 매개변수의 타입 또는 개수가 다름
✔️ 반환 타입이 다르더라도 매개변수가 같으면 오버로딩 불가능 (add(int) 와 add(int): double은 불가)
✔️ 컴파일러가 메서드 호출 시점에서 적절한 메서드를 선택


📌 오버라이딩(Overriding) 예제

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

// 자식 클래스 - 오버라이딩
class Dog extends Animal {
    @Override
    void sound() { // 부모 메서드 재정의
        System.out.println("멍멍!");
    }
}

// 자식 클래스 - 오버라이딩
class Cat extends Animal {
    @Override
    void sound() { // 부모 메서드 재정의
        System.out.println("야옹!");
    }
}

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

        Animal myDog = new Dog();
        myDog.sound(); // 멍멍! (오버라이딩된 메서드 호출)

        Animal myCat = new Cat();
        myCat.sound(); // 야옹! (오버라이딩된 메서드 호출)
    }
}

🔹 오버라이딩 특징

✔️ 부모 클래스의 메서드를 자식 클래스에서 재정의
✔️ 부모 클래스의 메서드와 메서드 이름, 매개변수 타입, 개수가 동일해야 함
✔️ 부모 메서드보다 더 강한 접근 제한자를 사용할 수 없음 (public → private 불가)
✔️ @Override 어노테이션을 사용하여 컴파일러가 올바르게 오버라이딩했는지 체크 가능
✔️ 다형성(Polymorphism)을 통해 부모 타입 변수로 자식 클래스의 메서드를 호출할 수 있음


📌 오버로딩 vs 오버라이딩 요약

  1. 오버로딩: 같은 클래스 내에서 같은 이름의 메서드를 여러 개 정의 (매개변수 다름)
  2. 오버라이딩: 부모 클래스의 메서드를 자식 클래스에서 재정의 (상속 필수)
  3. 오버로딩은 컴파일 시 결정, 오버라이딩은 런타임 시 다형성 적용

💡 정리

오버로딩 → 메서드의 시그니처(매개변수)를 다르게 하여 같은 이름으로 여러 개 선언
오버라이딩 → 부모 클래스의 메서드를 자식 클래스에서 재정의 (상속 필요)
오버라이딩은 다형성을 활용한 동적 바인딩을 가능하게 함


 

728x90