[JAVA] 오버로딩 vs. 오버라이딩

오버로딩은 동일한 이름의 생성자나 메서드를 매개변수 차이로 구분하는 것
오버라이딩은 상속 관계에서 부모 메서드를 자식 클래스가 재정의하는 것

Overloading

1. 개념

  • 동일한 이름의 메서드나 생성자를 매개변수(parameter)의 타입, 개수, 순서를 달리하여 정의
  • 접근 제어자와 반환 타입은 무관
  • 동일한 기능을 가진 다양한 입력 타입에 대응
  • 가변 인자(int…nums) 사용 시, 배열(int[] nums)과 같이 사용X

2. 작성법

class Constructor {
    // 생성자 오버로딩
    Constructor() {
        System.out.println("1번 생성자");
    }

    Constructor(String str) {
        System.out.println("2번 생성자");
    }

    Constructor(int a, int b) {
        System.out.println("3번 생성자");
    }
    
    // 메소드 오버로딩
    public void run(){
        System.out.println("첫번째 런 메소드");
    }
    public void run(int a){
        System.out.println("두번째 런 메소드");
    }
}

Overriding

1. 개념

  • 상위 클래스에서 상속받은 메서드를 하위 클래스에서 재정의하여 사용하는 것
  • 다형성을 활용하여 유연한 설계
  • 성립 조건
    • 메서드 이름, 매개변수이 부모 메서드와 동일
    • 반환 타입은 부모보다 하위 타입만 가능(LSP 원칙)
      • 기본형은 변경 불가
      • X: long → int
      • O: Number → Integer
    • 접근 제어자는 부모보다 좁아질 수 없음(LSP 원칙)
      • X: public → protected
      • O: protected → public
    • final로 선언된 메서드는 오버라이딩X
    • 부모보다 같거나 더 구체적인 예외 선언만 가능(Checked Exception만 해당)
      • X: IOException → Exception
      • O: Exception → X
      • Unchecked Exception(RuntimeException 계열)은 오버라이딩 제한 대상이 아님
    • static으로 선언된 메서드는 상속되지만 오버라이딩되지 않음
      • 자식 클래스에서 동일한 시그니처로 선언 시, 오버라이딩이 아닌 숨김(hiding)
      • 컴파일 타임에 참조 타입 기준으로 바인딩됨

2. 작성법

class Parent {
   static void runStatic(){
       System.out.println("부모의 정적 메서드");
   }
   
   protected int run (int a) throws Exception{
       System.out.println("부모의 protected 제어자 & 넓은 예외");
       return a;
   }
}
class Child extends Parent {
    // OverridingX hiding
    static void runStatic(){
        System.out.println("자식의 정적 메서드");
    }
    // Overriding
    public int run(int a) throws IOException{
        System.out.println("자식의 퍼블릭 제어자 & 구체적 예외");
        return a;
    }
}

Categories:

Updated:

Leave a comment