2011년 5월 6일 금요일

자바의 상속을 방지하는 명령어(final)

자바의 상속에 대해서 저번에 공부했었는데 final이란 키워드를 잠시 언급했었다. final이 어떨때 필요하고 어떻게 쓰이는지 알아보는 시간을 갖기로 하자. final 말그대로 마지막 최종 종결자(?)다. class 앞에 final이 붙으면 이 클래스는 상속할수 없게 된다. 메소드의 경우도 마찬가지로 앞에 final이 붙으면 이 메소드는 오버라이드 해서 재정의할수 없게 된다. 상속시 전부 똑같은 형태 즉 메소드 오버라이드해서 내용은 자기가 원하는 입맛대로 쓸수 있었지만 final이 붙었을 경우 이렇게 재정의해서 쓰는것이 불가능하다.


final class Parent
{
   final int total=0;

   final void pmethod( )
   {
       int a=0;
   }
}

class Child extends Parent  //final 때문에 상속불가능해서 에러남.
{
   int total=100; //final 때문에 값을 변경하지 못해서 에러남.

   void pmethod( )  //final 때문에 오버라이드 불가능해서 에러남.
   {
      int a=100;
   }
}

위의 예제에서 보듯이 설령 class 앞에 final이 없어서 상속까진 되었다고 하더라도 메소드에 final이 있으면 역시 에러난다. 변수에 붙어도 마찬가지로 final이 있으면 초기화된 그 값은 절대 변경할수 없다. 그렇다면 자바에서는 왜 이런 기능을 만들어 놓았을까?

여러분이 프로그램을 만들때 어떤 변수는 그 값을 변경하면 안되는 것이 있을수도 있고 혹은 보안을 위해서 어떤 메소드는 항상 똑같은 기능 이외에 다르게 쓰면 안되는 경우가 있을수 있다. 클래스에 final을 걸어놓으면 아예 상속이 불가능하여 원천적인 봉쇄가 가능해 완벽한 은닉이 가능해진다. 대표적인 final 클래스의 예로 우리가 jdk api에서 불러 쓰고 있는 System이나 String, 혹은 Math 클래스 같은 것들이 있다. 누군가가 System 클래스를 상속받아 재정의해 버린다면 제작자의 의도와는 다르게 치명적인 에러가 날수 있다. 이를 방지하기 위해 이런 중요한 클래스들은 자바에서 이미 final로 만들어 놓았다.

부분적으로도 가능한데 메소드의 예를 들자면, 뭔가 열리는 기능을 갖춘 open( ) 이라는 메소드를 만들었는데 누군가가 이를 오버라이드 해서 open( ) 메소드를 열리는게 아닌 뭔가 닫히는 기능으로 바꿔버린다면 전체 프로그램이 엉망이 될것이다. 이렇게 상속해서 공유해 쓰는것은 가능하지만 부분적으로 변경을 원하지 않는 경우 우리는 그 부분을 final로 만들면 이런 발생가능한 위험을 사전에 차단할수 있다.

또한 final은 프로그램의 성능 향상에 기여한다. 지금 단계에서 할말은 아닌듯 하지만 자바에서는 메소드가 하위 클래스에서(상속받은 클래스에서) 오버라이드 하는지 안하는지 검사를 한다. 그런데 메소드 앞에 final이 붙어있으면 자동으로 이런 검사를 안하게 되어 메소드 호출시 속도를 높여 성능향상에 기여하게 된다.

다시 정리하자면,
final이 붙은 클래스는 상속할수 없다.
final이 붙은 메소드는 오버라이드할수 없다.
final이 붙은 초기화된 변수(final int a=0;)는 값을 변경할수 없다.(a=1; 불가능)
final이 붙은 선언만된 변수(final int a;)는 값을 오직 한번만 넣을수 있다.
(a=1; 가능, 하지만 두번째부터는 a=0; 불가능)
오직 한번이라고 했으니 그 다음부터 1 이외의 다른 값으로 변경불가능하다.

자바의 상속에 대해서 공부하고 느끼겠지만 그에 대한 파장(?)이 얼마나 큰지 몸소 체험하고 있을 것이다. 아직도 갈길이 멀다. 그래서 오늘은 강좌를 본의아니게 짧게 마무리한다. 다음시간을 위해 에너지(?)를 비축해두기 바란다.^^

댓글 8개:

  1. 정말 개념적인 접근에서의 설명 좋습니다~^^

    댓글을 안 쓰고 갈래야 안 쓰고 갈 수 가 없네요^^

    아무튼 열심히 잘 보고 있으니 앞으로도 좋은 강좌

    부탁드릴께요^^

    답글삭제
  2. 좋은 설명 고맙습니다 ^^

    답글삭제
  3. I like what you guys are usually up too. This kind of clever work and coverage!

    Keep up the awesome works guys I've incorporated you guys to blogroll.

    Feel free to visit my page: cellulite treatment

    답글삭제
  4. 덕분에 final 개념확실히잡았네요

    답글삭제
  5. Hi there, everything is going fine here andd ofcourse every one is sharing information, that's actually excellent,
    keep up writing.

    my web page; private health insurance

    답글삭제