흔히 Android에서
Button.SetOnClickListener 를 자주 사용하는데
이때 꼭 알아야할 개념이
Lambda function 과 Listener이다.
Listener의 동작 원리?
Android OS는 View에 달려있는 모든 Listener를 켜놓는다.
View.OnClickListener에는 onClick이라는 메소드가 존재하고
실제 클릭 이벤트가 발생할 때마다 어느 View에서 이벤트가 발생했는지 식별하여
오버라이딩한 메소드 동작을 수행한다.
동작 수행의 주체는 Android OS이다.
예제를 통해 아라보자
[Layout.xml]
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/lambda_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="람다함수 버튼"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintRight_toLeftOf="@id/anonymous_button"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
<Button
android:id="@+id/anonymous_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="익명함수 버튼"
app:layout_constraintLeft_toRightOf="@id/lambda_button"
app:layout_constraintRight_toLeftOf="@id/declaration_button"
app:layout_constraintBottom_toBottomOf="@id/lambda_button"
app:layout_constraintTop_toTopOf="@id/lambda_button"/>
<Button
android:id="@+id/declaration_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="선언함수 버튼"
app:layout_constraintLeft_toRightOf="@id/anonymous_button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/lambda_button"
app:layout_constraintBottom_toBottomOf="@id/lambda_button" />
</androidx.constraintlayout.widget.ConstraintLayout>
[Activity.kt]
package com.example.android_tutorial
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.function_test_layout.*
class FunctionTestActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.function_test_layout)
init()
}
private fun init() {
// 람다식으로 인자 전달
lambda_button.setOnClickListener {
Log.i("Function Test", "this is Lambda Button click")
}
// object 익명함수 객체로 인자 전달
anonymous_button.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) {
Log.i("Function Test", "this is anonymous function Button click")
}
})
// 함수 선언
val clickListenFunction = object : View.OnClickListener {
override fun onClick(v: View?) {
Log.i("Function Test", "this is declarative function Button click")
}
}
// 선언함수를 리스너의 인자로 넘김
declaration_button.setOnClickListener(clickListenFunction)
}
}
[결과화면]
위의 예제에서 알 수 있듯이
어떤 방식으로 구현하든 같은 동작을 수행하고 또 의미도 같지만
최신 Android Studio 에서는 람다식의 사용을 권장한다.
[Listener]
위에 보이는 것과 같이 인터페이스 클래스이기 때문에
onClick이라는 함수를 따로 구현(Overriding) 해줘야한다.
그래서 익명객체인
object: View.onClickListener {
override fun onClick(v: View?) {
~~~ }
}
와 같은 형태가 나오는 것이다.
람다식은 대체 파라미터인 View를 어떻게 인자로 전달하나?
Android Studio로 람다식을 사용하다보면 다음과 같은
'it' 키워드를 만나게된다.
따로 명세하지 않아도 View 객체를 파라미터로 넘긴다고 암묵적으로 약속되어있다.
그야말로 개꿀딱이다.
'Android > OS' 카테고리의 다른 글
[Android] Activity Life Cycle (0) | 2020.05.01 |
---|---|
[Android] Constraint Layout (0) | 2020.04.14 |
[Android] Tab - Layout (0) | 2020.04.13 |