안드로이드에서 final 을 자주 쓰는이유가 무엇일까요?

 

먼저 코드를 봅시다.

 

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class ButtonTestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final Button btn = (Button) findViewById(R.id.Button01);

btn.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
btn.setText("clicked!");
}
});
}
}

 

여기서 final 을 쓴 이유가 무엇일까요?

저기서 final 을 쓰지 않으면 아래와 같은 오류가 납니다.

 

Cannot refer to a non-final variable btn inside an inner class defined in a different method

 

사실 처음에는 “final 을 쓰면 전역변수처럼 되나?” 라고 생각했는데 그렇다면 static 하고 비교가 애매해 집니다.

그리고 메모리관리 측면에서도 낭비가 되죠.

 

여기서 final 의 일반적인 정의를 좀 알아봅시다.

바로 “상수화” 시킨다는것 입니다.

 

사실 이 말은 프리미티브 타입에만 통하는 말입니다.

프리미티브 타입이 아닌 객체에는 “참조를 변경할수 없음” 이라는 말이 더 어울립니다.

 

결국 위의 소스에서 btn 이라는 변수의 참조가 변경되지 않기 때문에 컴파일러가 변수명이 아니라 참조주소로 바로 접근 가능하도록 할 수 있게 되는것 입니다.

 

이것은 전역변수는 아니고 “지역적 치환문” 정도로 생각하는게 좋을꺼 같습니다.

by cranix 2010. 12. 23. 18:32