CS/JAVA

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

hyunji1109 2025. 2. 27. 15:22

출처: https://medium.com/@mesfandiari77

 

 

오버로딩(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 Main {
    public static void main(String[] args) {
        Calculator calc = new Calculator();
        System.out.println(calc.add(3, 5));         // 출력: 8
        System.out.println(calc.add(3.5, 4.2));     // 출력: 7.7
        System.out.println(calc.add(1, 2, 3));      // 출력: 6
    }
}

 

 

 


 

Overriding (오버라이딩)

  • 부모 클래스나 인터페이스의 메서드를 자식 클래스에서 재정의하는 것
  • 부모 메서드를 재정의하여 자식 클래스에 맞게 변경
  • 상속 관계에서 이루어진다

 

특징

 

  • 메서드 이름, 매개변수, 리턴 타입이 부모와 완전히 동일해야 한다
  • 부모의 기능을 유지하거나 새롭게 재정의
  • 프로그램 실행 중에 결정
  • @Override 애너테이션을 사용하는 것이 좋다

 

 

예)

class Parent {
    void sayHello() {
        System.out.println("Hello from Parent!");
    }
}

class Child extends Parent {
    @Override
    void sayHello() { // 부모의 메서드를 재정의
        System.out.println("Hello from Child!");
    }
}

public class Main {
    public static void main(String[] args) {
        Parent parent = new Parent();
        parent.sayHello(); // 출력: Hello from Parent!

        Parent child = new Child();
        child.sayHello();  // 출력: Hello from Child!
    }
}

 

 

 

 

특징 Overloading Overriding
클래스 관계 같은 클래스 부모-자식 클래스 (상속 관계)
메서드 이름 동일 동일
매개변수 달라야 함 완전히 동일
리턴 타입 달라도 가능 동일해야 함
실행 시점 컴파일 타임 런타임
키워드 필요 없음 @Override 권장

 


 

@Override 

  • Java에서 메서드를 재정의할 때 사용하는 애너테이션
  • 부모 클래스 또는 인터페이스의 메서드를 자식 클래스에서 재정의(오버라이드)하고 있음을 컴파일러에 알림
  • 코드의 가독성이 높아지고, 재정의 과정에서 실수를 방지

 

장점

  • 컴파일 오류 방지
    • 부모 클래스의 메서드 이름이나 시그니처를 잘못 입력했을 경우, 컴파일 시 오류를 발생시켜 실수를 잡아준다
  • 가독성 향상
    • 이 메서드가 부모 클래스의 메서드를 재정의한 것임을 다른 개발자들이 바로 이해할 수 있다
  • 일관성 유지
    • 코드 리뷰 및 유지보수 시, 의도적으로 재정의한 메서드임을 명확히 알 수 있다

 

예)

class Parent {
    void sayHello() {
        System.out.println("Hello from Parent!");
    }
}

class Child extends Parent {
    @Override
    void sayHello() { // 부모 메서드 재정의
        System.out.println("Hello from Child!");
    }
}

public class OverrideExample {
    public static void main(String[] args) {
        Parent obj = new Child();
        obj.sayHello(); // 출력: Hello from Child!
    }
}

 

 

💥 실수 방지

class Parent {
    void sayHello() {
        System.out.println("Hello from Parent!");
    }
}

class Child extends Parent {
    @Override
    void sayHelloo() { // 오타로 인해 부모 메서드를 재정의하지 못함
        System.out.println("Hello from Child!");
    }
}