[코틀린] 함수 호출시, 인자에 함수 대입하기
2020. 12. 9. 21:01ㆍ바삭바삭 IT/코틀린
자바8에서도 지원하는 람다 표현식! 코틀린에서는 더 직관적인 문법을 갖고있는데요. 그 중에서 함수를 호출할 때 인자로 함수를 넘기는 방법을 람다식으로 표현해보려 합니다.
예를들어, WordListAdapter라는 클래스에 클릭함수 onClickListener(item: Word)를 MainActivity에서 재정의하고, WordListAdapter를 생성할때 인자로 넘기고 싶습니다.
▶ WrdListAdapter.kt
WordListAdapter클래스는 생성자에 context와 onClickListner함수를 인자로 넘겨받습니다.
Class WordListAdapter(
private val context: Context,
val onClickListener: (Word)->Unit
) : RecyclerView.Adapter<WordListAdapter.WordViewHolder>() {
override fun onBindViewHolder(holder: WordViewHolder, position: Int) {
...
holder.itemView.setOnClickListener {
onClickListener(this.mWords?.get(position)?:Word(""))
}
...
}
}
▶ MainActivity.kt
MainActivity에서 WordListAdatper를 생성합니다. 아래 정의한 itemClicked를 인자로 넘겨야 합니다.
이때 그 인자가 마지막 인자라면 아래와 같이 괄호() 외부에 { 람다식 }을 선언할 수 있습니다.
외부로 빼도 되고,
WordListAdapter(this, {item:Word -> itemClicked(item)} )
이렇게 내부에 선언해도 됩니다!
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val recyclerView = WordListAdapter(this) { item: Word -> itemClicked(item) }
}
private fun itemClicked(word : Word) {
Toast.makeText(this, "Clicked: ${word.mWord}", Toast.LENGTH_LONG).show()
}
}
코드를 분석하다가 저렇게 괄호() 외부에 선언하는 방식이 낯설었는데요, 자주 사용하며 익혀둬야겠습니다 :)
반응형
'바삭바삭 IT > 코틀린' 카테고리의 다른 글
[코틀린] var과 val의 차이 (0) | 2021.09.19 |
---|---|
[코틀린] 범위 지정 함수 let(), apply(), with(), run(), also() (0) | 2021.09.03 |