자바에서 왜 super.super.method();는 안되는거죠?
조회수 5156회
제가 어떤 질문을 보던중에 밑에 코드처럼 super.super.method()를 이용하면 간단히 해결되잖아라는 생각이 들었는데요.
소스코드
@Override
public String toString() {
return super.super.toString();
}
super.super.method();가 많은 경우에 유용한지는 모르겠지만 갑자기 궁금해졌어요. 왜 이게 안되는걸까? 그리고 다른 언어에도 이런게 안되나? 혹시 아시는분 계시면 설명좀 해주세요.
1 답변
-
super.super.method()는 캡슐화를 위반합니다. super.super.method는 부모클래스의 처리를 우회하게 만드는데 그렇게 되면 많은 문제가 발생합니다.
예를들어, 다음과 같이 아이템을 모으는 코드가 있다고 가정합시다.
소스코드
public class Items { public void add(Item item) { ... } } public class RedItems extends Items { @Override public void add(Item item) { if (!item.isRed()) { throw new NotRedItemException(); } super.add(item); } } public class BigRedItems extends RedItems { @Override public void add(Item item) { if (!item.isBig()) { throw new NotBigItemException(); } super.add(item); } }
여기까진 괜찮습니다. BigRedItems를 보면 super.add(item)에서 RedItems의 처리를 받아서 아이템이 빨강이 아니면 예외를 날리기 때문에 RedItem은 항상 붉은색을 가집니다. 그리고 이제 super.super.add();가 가능하다가고 가정해보면
public class NaughtyItems extends RedItems { @Override public void add(Item item) { // 아이템이 빨강이든 아니든 예외처리를 하지않습니다. super.super.add(item); } }
RedItems의 예외처리를 받지 못하기 때문에 RedItems을 상속받은 의미가 없게됩니다.
댓글 입력