현 블로그는 모바일 환경이 아닌 PC환경에 최적화 되어있습니다.

 Mir의 운영환경

 본체

 Desktop

 O S

 Windows 7

 Application1

 Android Studio 1.5

 Application2

 

Final을 쓰는 이유


안드로이드(Android)에서 자주 보이는 Final에 대해 알아보자.


열심히 안드로이드 공부(바로 개발에 착수 할려했지만.. 안드로이드를 너무 얕봤었네요.. ㅠ) 하는 중

계속 눈에 띄는 'Final'이 도데체 뭔지 알아보았습니다.


Final의 기능은 지역변수를 상수화 시켜주는 명령어입니다.

무슨 뜻인지 아래 소스를 보면서 이야기 하겠습니다.

    public class TestActivity extends Activity  {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            TextView textview = (TextView)findViewById(R.id.textView1);

            LinearLayout layout = (LinearLayout)findViewById(R.id.linear);
            layout.setOnTouchListener(new View.OnTouchListener() {
                public boolean onTouch(View v, MotionEvent e) {
                    textview.setText("Touched"); //에러 발생
                    return true;
                }
            });
        }

위 소스에서 textview를 아래 layout 이벤트속에 담아 정의 하였습니다.

언뜻 보면 문제가 없어 보이지만 실제 컴파일을하게 되면

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

이라는 에러가 발생하게 됩니다.


textview라는 변수를 잘 보면 우선 TestAcivity Class에 속해있는 전역변수도 아니고

onTouch이벤트의 파라미터도 아닙니다.

그냥 OnCreate에 선언되어 있는 지역변수일뿐입니다.


그럼 OnCreate가 한번 실행되고 나면 지역변수는? 

당연히 사라지게 됩니다.


onTouch이벤트의 경우는 OnCreate가 실행되고 난뒤 사라지지 않고 Listener에 등록되어

이벤트가 발생하길 기다리고 있습니다.


만약 onTouch 이벤트가 실행된다면?


지역변수 textview는 이미 사라져 없어졌기때문에

어떤 textview의 텍스트를 바꿔야 될지 모르게 되는겁니다.

즉 에러가 발생하는겁니다.

(기본적으로 컴파일에서부터 에러가 뜨기때문에 실행자체가 되지 않습니다.)



만약 Final을 textview앞에 붙힌다면?


textview는 생성과 즉시 상수로 인식되며

OnCreate가 실행되고 난뒤에도 존재하게 되는겁니다.


그러면 onTouch가 실행되더라도 어떤 textview인지 알게되니 정상적으로 텍스트를 바꿀수 있는겁니다.




※ 관련글




+ Recent posts