System.out.println("Hello, World");

가장 중요한거부터 언급

- 리스너로 전달할 지역 변수는 final로 선언한다.




 텍스트뷰 객체를 mText 멤버로 선언하고 onCreate에서 딱 한번만 조사한다. onTouch에서는 텍스트 뷰를 따로 구할 필요 없이 mText 멤버를 참조하면 된다. 메서드로 뭔가 전달할 것이 있으면 인수를 사용하는 것이 문법적인 정석이다. 그러나 이벤트 핸들러의 경우 인터페이스에 의해 원형이 고정되어 있으므로 인수를 더 추가할 방법이 없다. 그래서 어떡하든 핸들러내에서 참조할 수 있는 형태로 전달해야 하는 것이다.


이 방법도 문제가 있는데 리스너가 아주 많을 경우 각 리스너로 전달할 변수를 일일히 클래스의 멤버로 선언하자면 외부 클래스가 너무 뚱뚱해진다는 것이다. 멤버란 클래스의 상태를 저장하는 변수이지 정보 전달용이 아니다. 외부 클래스를 날씬하게 유지하려면 특정 리스너로 전달할 값은 메서드의 지역 변수로 선언해야 한다. 이런 경우는 코드가 조금 더 복잡해진다. 



onTouch가 호출되었을때는 outText 변수가 존재하지 않으므로 outText의 실제값을 참조할 수 없다. 미래에 호출될 리스너에게 현재의 지역 변수값을 전달하는 것은 불가능하다. 

이에 비해 지역 변수에 final을 붙이면 더 이상 변경할 수 없는 상수가 되므로 onTouch를 등록하는 시점에 그 값을 분명히 전달 할 수 있다. 

onTouch 메서드에서 참조하는 outText는 리스너가 등록될 시점의 값을 가지는 상수객체이다. outText변수와 onTouch 리스너는 생성 시점과 등록 시점이 같지만 존재 기간은 서로 다르다. outText는 일개 지역 변수이지만 onTouch는 리스너로 등록되므로 사실상 전역적으로 지속된다.




Posted by 김마농