이 글은 겐도님의 2008년 10월 30일의 미투데이 내용입니다.

트랙백 주소 :: http://gendoh.com/2511143/trackback/

  1. 2008/11/03 16:39 답글수정삭제

    비밀댓글 입니다

    • 겐도 2008/11/04 01:32 수정삭제

      오버라이딩의 규칙은 대충 6가지 정도 인 것 같습니다.
      1. 상속받은 클래스에 존재해야 하고

      이건 당근이겠죠.

      2. 같은 이름
      3. 같은 파라미터
      4. 같은 리턴타입

      그래야 되지 않겠습니까?

      5. 같거나 유연한 접근성
      가령 public을 protected로 오버라이드 했다고 생각해 봅시다. 부모 A에 대해 자식 B로 상속을 했고 B객체를 A 레퍼런스에 넣어서 해당 매쏘드를 호출하면? 실제론 B의 매쏘드가 호출되어야 하는데 protected이니 말이 안되죠. 의미적 모순이 일어납니다.
      반대케이스는 문제 없습니다. A에서 protected이고 B에서 public이라고 한다면 A 레퍼런스 상황에선 부를 수 없지만 B로 레퍼런스 하고 있다면 부를 수 있죠. 어차피 클래스 내부에선 상관 없구요.

      6. 익셉션의 범위는 같거나 작아야 한다.
      위의 A와 B에서 B가 좀더 큰(상위) 익셉션을 날린다면, A로 레퍼런스 하고 있는 B객체를 처리하는 함수의 경우 A의 범위까지만 예외처리중이라면 당연 핸들링 할 수 없는 익셉션이 일어납니다.
      예외의 상속 관계에서 자식보다 부모가 범위가 더 크다는 것을 이해해야 합니다. "동물"과 "고양이"를 생각해 보면, "개"는 절대 고양이로 커버할 수 없습니다.
      자바는 안전함을 많이 고려한 언어입니다. 이런 얼토당토 않은 상황을 용납할 수 없겠죠. 뭐 상위에서 크게 잡고 있으면 되지 않냐, 혹은 실제로 보니 작은 범위의 익셉션만 일어나더라 하는 주장을 펼 수도 있습니다만 자바의 특징 자체가 컴파일시에 안전성이 최대한 보장될 수 있게 합니다. 따라서 허용하지 않는 것입니다.

    • 럭키도스 2008/11/04 15:55 수정삭제

      그렇군요..이제 어느정도 이해가 되는거 같네요.~
      답변 정말 감사합니다.

      이렇게 자세하게 해 주실주 몰랐는데...정말 감사해요.

옵션
댓글 달기