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

조회수 5100회

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

소스코드

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

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

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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)