자바에서 왜 super.super.method();는 안되는거죠?


제가 어떤 질문을 보던중에 밑에 코드처럼 super.super.method()를 이용하면 간단히 해결되잖아라는 생각이 들었는데요.

소스코드

@Override
public String toString() {
    return super.super.toString();
}

super.super.method();가 많은 경우에 유용한지는 모르겠지만 갑자기 궁금해졌어요. 왜 이게 안되는걸까? 그리고 다른 언어에도 이런게 안되나? 혹시 아시는분 계시면 설명좀 해주세요.

  • 2016년 01월 20일에 작성됨

조회수 255


1 답변


좋아요
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을 상속받은 의미가 없게됩니다.

  • 2016년 01월 20일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close