상속 시, 오버라딩된 메서드는 부모클래스의 메서드보다 같거나 확장된 접근만을 허용한다.
public class A {
void method() { ... }
}
// XXX 컴파일 오류
public class B extends A {
@Override
private void method() { ... }
}
// OOO
public class C extends A {
@Override
public void method() { ... }
}
이는 다형성
을 지원하기 위함이라고 생각한다.
만약 오버라이딩된 메서드의 접근 제어 수준을 낮게 설정할 수 있다면 LSP(리스코프 치환 원칙)을 어기게 된다.
리스코프 치환 원칙은 1988년 바바라 리스코프(Barbara Liskov)가 올바른 상속 관계의 특징을 정의하기 위해 발표한 것으로, 서브 타입은 언제나 기반 타입으로 교체할 수 있어야 한다는 것을 뜻한다.
이를 어기게 된다면 여러 사이드 이펙트가 발생할 수 있고 생각한다.
예를 들면,
List<A> list = List.of(new B(), new C());
list.forEach(A::method);
이러한 상황에서 B의 메서드의 접근 범위는 private
이기 때문에 오류가 발생할 것이다.
하위 타입이 상위 타입으로 교체될 수 없는 상황이기에 다형성
을 완벽하게 지원하지 못한다.
'의문과 실험' 카테고리의 다른 글
메인 메서드에 대한 고찰 (0) | 2024.01.03 |
---|---|
Monitor와 Synchronized 동작 알아보기 (1) | 2024.01.01 |
[Spring] 프로젝트에서 IO를 줄여 성능을 개선해보자 (0) | 2023.10.04 |
[Spring] JPA 엔티티에는 접근자 메서드외의 다른 메서드가 선언되어도 되는가 (0) | 2023.08.15 |
Model이 DTO의 존재를 모르게 하라? Model과 DTO (0) | 2023.07.11 |