🧑‍💻복습/자바

자바 오버라이딩 복습하기 ! (oop-ex06-c-0200)

우동한그릇 2023. 6. 16. 17:15
반응형

오버라이딩이란 ? 

 

오버라이딩(overriding)은 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것을 말합니다. 

오버라이딩은 다음 조건을 만족해야 합니다.

 

  1. 메서드 이름이 동일해야 합니다.
  2. 메서드 시그니처(이름과 매개변수의 타입, 개수, 순서)가 동일해야 합니다.
  3. 접근 제어자는 부모 클래스의 메서드보다 같거나 더 넓은 범위로 변경할 수 있습니다.
  4. 예외 타입은 부모 클래스의 메서드와 일치하거나, 부모 클래스의 메서드가 던지는
    예외의 하위 타입을 선언할 수 있습니다.
  5. 반환 타입은 일치해야 합니다. (자바 5부터는 반환 타입의 공변성을 허용합니다.)


따라서 오버라이딩은 부모 클래스의 메서드와 동일한 시그니처를 가져야 하며, 

메서드 내부에서 추가적인 인스턴스 변수를 사용하거나 다른 동작을 정의할 수 있습니다. 

 

인스턴스 변수의 추가나 다른 동작을 정의하는 것은 오버라이딩에 영향을 주지 않습니다. 

오버라이딩된 메서드는 부모 클래스의 메서드와 동일한 시그니처를 유지하면서, 

자식 클래스에서 부모 클래스의 동작을 재정의하여 사용할 수 있습니다.

따라서 오버라이딩은 메서드의 시그니처를 유지하면서 내부 동작을 변경하는 것이 가능하며, 

추가적인 인스턴스 변수나 다른 동작을 정의하는 것은 허용됩니다. 

이를 통해 자식 클래스는 부모 클래스의 동작을 확장하거나 수정할 수 있습니다.

 

 

  static class Score {
    String name;
    int kor;
    int eng;
    int math;
    int sum;
    float aver;

    public void compute() {
      this.sum = this.kor + this.eng + this.math;
      this.aver = this.sum / 3f;
    }
  }
  static class Score2 extends Score {
    int music;
    int art;

    // 오버라이딩(overriding)?
    // => 상속 받은 메서드를 서브 클래스의 역할에 맞게 재정의하는 문법
    // => 상속 받은 메서드와 똑 같은 시그너처(메서드명,파라미터 타입/개수/순서)로 메서드를 정의한다.
    // => 오버라이딩 메서드는 원래의 메서드 보다 접근 범위가 같거나 커야 한다.
    // 원래의 메서드 보다 접근 범위가 줄어들면 안된다.

    @Override
    public void compute() {
      this.sum = this.kor + this.eng + this.math + this.music + this.art;
      this.aver = this.sum / 5f;
    }
  }

 

배운 내용 요약 및 정리 )

접근 범위가 같거나 커야 한다는 것은.

score 가 default 일때, score는 적어도 default 거나 범위가 더 큰 public 이어야 한다는 뜻이다.

 

또한 오버로딩과 다른 점은 상속 받은 메서드와 똑같은 시그니처 (메서드명, 파라미터 타입/개수/순서)로

메서드를 정의해야한다는 것이다.

대신 내부 인스턴스 변수를 추가하거나 다른 동작을 정의하는 것은

영향을 주지 않는다.

 

오버로딩은 같은 기능을 가진 메서드를 다른 타입/개수/순서를 가진 파라미터를

통해 재정의하는 것이다.

반응형