티스토리 뷰

Development

[Android] final 을 쓰는이유

devbible 2010. 7. 23. 14:12




public class Test extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView( R.layout.myTest ); 
  
  final TextView outText = (TextView)findViewById(R.id.textView01);
  
  LinearLayout linear = (LinearLayout)findViewById(R.id.linear01);
  
  linear.setOnTouchListener(new View.OnTouchListener() {
   
   @Override
   public boolean onTouch(View v, MotionEvent event) {
    if(event.getAction() == MotionEvent.ACTION_DOWN){
     outText.setText("Touch");
     return true;
    }
    return false;
   }
  });
 }
}


자. 위에 소스를 보자.
outText 는 Activity의 member도 아니고 onTouch의 지역변수도 아니고
onCreate의 지역변수로 선언되어있다. Handler는 자신을 등록하는 외부메서드의
지역변수를 참조해야 하는데
, 이때 외부 지역 변수에 final 지정자를 반드시 붙여야한다.

final 지정자를 붙이지 않으면 아래와 같은 오류를 배터낸다.
Cannot refer to a non-final variable outText inside an inner class defined in a different method

outText 변수는 onCreate 가 리턴되면 사라지는 지역 변수이다.
반면, onTouch메서드는 TouchListener로 등록되며 onCreate가
리턴된 후에라도 이벤트가 발생하면 언제든지 호출 될 수있다.

onTouch가 호출되었을때 outText 변수가 존재하지 않으므로,
outText의 실제값을 참조 할 수가 없는 것이다.

final을 붙이게되면 그 값은 더 이상 변경할 수 없는 상수가 되므로
onTouch를 등록하는 시점에 그 값을 분명히 전달 할 수있다.
onTouch메서드에서 참조하는 outText는 Listener가 등록될
 시점의 값을 가지는 상수 객체이다.

outText 변수와 onTouch Listener 는 생성 시점과 등록시점은 같지만
존재 기간은 서로 다르다.
outText는 일개 지역변수이지만 outTouch 는 Listener로 등록되므로
사실상 전역적으로 지속된다.

한마디로,
Listener로 전달하고 싶은 지역변수는 final 로 처리해야 한다는 말이다.

[작성자] devbible.tistory.com
[참고문헌] 한빛미디어, 안드로이드프로그래밍정복, 김상형저

댓글