안드로이드 개발 질문/답변
(글 수 45,052)
안드로이드 이제 입문한 초보입니다.
TextView에 안녕하세요라고 입력되있는상태에서
EditText에 반갑습니다라고 입력하고 버튼을 누르면 TextView에 출력하게 하는 어플을 만들었는데요
여기서 궁금한점 2가지가 있습니다.
한가지는
TextView, EditText,Button 객체를 생성할때요
Button btn = (Button)findViewById(R.id.button1);
final TextView TV = (TextView)findViewById(R.id.tv);
final EditText ET = (EditText)findViewById(R.id.editText1);
이런식으로 생성을 했는데요
여기서
1. Button btn = (Button)findViewById(R.id.button1);
과
2. Button btn1 = new Button(this);의 차이점을 알고싶습니다.
1번으로 생성하고 실행하면 오류없이 잘되는데 2번으로 하면 오류가 나더라구요
그리고
두번째는
final TextView TV = (TextView)findViewById(R.id.tv);
final EditText ET = (EditText)findViewById(R.id.editText1);
여기에 종단변수(final)이 왜 붙어야하는지도 궁금합니다.
이 두가지가 궁금합니다. 답변부탁드립니다. 감사합니다!!
findViewById는 글자그대로 이미 생성되어 객체를 id를 이용해 찾아오는 것입니다. xml로 작성한 버튼은 자동적으로 생성 되어서 화면에 보여지고 그 버튼을 컨트롤하기 위해서 id 값을 가지고 찾아 온다는 의미입니다.
new Button(this) 자체만으로는 오류가 없습니다. 다만 뭘 하려고 하면 오류가 발생하겠죠. Button을 만들었어도 실제 필요한 아무런 속성이 존재하지 않으니까요. Button을 코드로 생성하는건 말도 안되게 번거롭습니다. 그래서 일반적으로, xml에서 정의한 속성을 이용해서 inflate로 객체화 시켜서 사용하죠.
두 번째, final의 의미는 아실거라고 생각하구요. 메소드 내에서 final 변수를 사용하는 주된 이유는 익명클래스, 또는 지역클래스 때문입니다.
수행 범위가 메소드를 벗어나면 당연히 지역 변수는 삭제가 되겠죠. 그런데 익명 클래스는 메소드를 벗어나도 존재합니다. 그렇기 때문에 익명 클래스에서 사용하는 변수는 final로 선언하여 constant pool에 넣음으로써, 메소드 밖에서 호출 되더라도 해당 변수가 존재하는 것을 보장하게 합니다. 사실 이클립스를 사용하면 자동적으로 처리 해 주니 크게 신경 안쓰셔도 되는 부분이죠.