반응형
오버라이딩이란 ?
오버라이딩(overriding)은 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것을 말합니다.
오버라이딩은 다음 조건을 만족해야 합니다.
- 메서드 이름이 동일해야 합니다.
- 메서드 시그니처(이름과 매개변수의 타입, 개수, 순서)가 동일해야 합니다.
- 접근 제어자는 부모 클래스의 메서드보다 같거나 더 넓은 범위로 변경할 수 있습니다.
- 예외 타입은 부모 클래스의 메서드와 일치하거나, 부모 클래스의 메서드가 던지는
예외의 하위 타입을 선언할 수 있습니다. - 반환 타입은 일치해야 합니다. (자바 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 이어야 한다는 뜻이다.
또한 오버로딩과 다른 점은 상속 받은 메서드와 똑같은 시그니처 (메서드명, 파라미터 타입/개수/순서)로
메서드를 정의해야한다는 것이다.
대신 내부 인스턴스 변수를 추가하거나 다른 동작을 정의하는 것은
영향을 주지 않는다.
오버로딩은 같은 기능을 가진 메서드를 다른 타입/개수/순서를 가진 파라미터를
통해 재정의하는 것이다.
반응형