2020. 10. 19. 13:30ㆍ컴퓨터 수업/Android studio
안드로이드 스튜디오에서 컴파일을 기다리는 파일은 2개이다.
1. MainActivity.java
2. activity_main.xml
이 두 "클래스"는 Run 실행 시 (JVM을 통해) 메모리에 올라와 인스턴스화 된다.
각각 코드영역과 리소스영역이라고 칭한다.
두 영역은 분리되어 있다.
하지만 두 영역을 같이 써야, 제대로 된 프론트의 구실을 갖추게 되는데,
이를 onCreate 메소드의 setContentView(R.layout.activty_main);으로 구현한다.
즉 setContentView라는 메소드를 통해 물리적으로 R (resource file)에 있는 activity_xml에 접근할 수 있게 되는것이다.
리소스를 가져오면 그때부턴 프론트를 조작할 수 있다.
이 말은 곧 리소스를 가져오지 않으면 조작할 수 없다는 뜻이다.
따라서 버튼을 클릭하면 toast메시지를 출력하는 코드를 짤 때,
setContentView 메소드로 리소스를 불러오는 함수를 call하지 않으면
리소스영역에 접근할 수 없다.
이는 다음 코드로 확인 할 수 있다.
mButton = (Button)findViewById(R.id.button1) 이라는 statement는
리소스영역의 button1이라는 id를 가진 객체를
코드영역의 mButton 객체와 연결(대입) 시키는 부분이다.
따라서, 리소스를 불러오지 않았다면 (onCreate 메서드가 호출되지 않았다면) 해당 statement를 사용할 없는 것을 위의 코드에서 확인 할 수 있다.
문법을 보면 다운캐스팅이 실행된것을 알 수 있다.
mButton은 명백히 Button클래스의 인스턴스이다.
왜냐하면 내가 그렇게 선언 했으니까,
(Button)findViewById(R.id.button1);이라는 구문을 보면
(Button)이라는 문법에 의해, 어떤 캐스팅이 실행된 것을 예상할 수 있고,
왼쪽의 mButton이 객체타입이므로, 객체와 객체의 대입을 실행하려 하는중,
다운캐스팅이 실행되었음을 예상할 수 있다.
따라서,
findViewById(R.id.button1)은 객체를 반환하는 메서드이다.
이는 IDE의 기능인 Ctrl+Q를 통해서도 확인 할 수 있다. (IDE의 메뉴인 View에 있는 기능이다.)
다운캐스팅의 특성상, 스코프가 줄어드는 것은 아니다, 오히려 anonymous class
(Button)findViewById(R.id.button1)의 경우는 스코프가 자식으로 늘어나는 것이다.
왜 다운캐스팅을 했지.
findViewById는 View클래스를 반환한다.
따라서 View클래스의 자식클래스인 Button을 반환하고자 하는것으로
다운캐스팅이 맞다.
즉, Resource에 있는 button1에 대한 인스턴스의 멤버를 현재 mButton에게 물려주고 싶은것이다.
이는 곧, xml에 있는 모든 정보를 button1에게 물려주게 되는것과 같다.
(ex. 크기는 어느정도인지 등)
이벤트핸들러 형식의 메소드 설정
차례대로 읽어보면
mButton 인스턴스의 setOnClickListner 메소드를 호출한다.
Ctrl+Q를 눌러보면 알겠지만, 이 메서드는 아규먼트로 View.OnClickListner I를 필요로 한다.
아무래도 이 I는 메서드를 의미하는 것 같다. 아니다 인터페이스다.
이때 setOnClickListner메소드는 아규먼트로 OnClickListner 인터페이스를 필요로한다.
따라서 이 인터페이스는 아규먼트로 보냄과 동시에 구현해야되는데, 위의 방식을 이용해도 되고,
밑의 방식을 이용해도 된다.
거시적으로 바라본다면
onCreate 메소드가 실행 (앱 실행) 시,
mButton의 setOnClickListner메소드를 실행 -> 이벤트핸들러 스타일의 클릭시 발생하는 퍼포먼스를 수정함.
따라서, 이 setOnClickListner는 당연하게도 우리의 구현을 필요로 하는 인터페이스를 아규먼트로 받음
따라서, 이 setOnClickListner는 우리가 어떤, 클릭시 발생하는 퍼포먼스를 구현하기 위해서 자주 호출할 메서드가 될 것임.
그 다음으로, 아규먼트로 보내는 인터페이스는 당연히 구현해서 보내야 함으로
익명 인터페이스 구현을 사용했음
이때, 구현되는 메소드는 onClick 메소드이며, 이때 파라미터인 View v의 v는 내가 클릭한 객체의 View를 뜻함.
따라서, 위에 보다싶이 v.getId() 메소드가 동작함.
가장 중요한건
이벤트핸들러 방식의 프로그래밍에서의 스타일이다.
바로 setOnClickListner를 보면 알 수 있는데,
onCreate라는 이벤트가 발생 -> setOnClickListner라는 메소드가 호출->
setOnClickListner 메소드를 통해 onClick이라는 이벤트 발생시의 퍼포먼스를 결정한다.
즉 이 메소드를 통해 클릭시 발생하는 퍼포먼스를 모두 코더가 구현한다.
이때 이 결정방법이 인터페이스를 익명클래스로 구현하여 아규먼트로 넘기는 방식이다.
이러한 방식이 바로 안드로이드 스튜디오의 이벤트핸들러 스타일일테니 코딩방식을 숙지하면 좋을것같다.
'컴퓨터 수업 > Android studio' 카테고리의 다른 글
onClick (0) | 2020.10.06 |
---|---|
Android studio로 계산기 만들기. (0) | 2020.09.12 |
안드로이드 스튜디오 단축키 (0) | 2020.09.12 |
앱 안의 버튼을 눌렀을 때, 특정한 일이 일어나게 하는 방법. (0) | 2020.09.11 |