[코틀린] 함수 호출시, 인자에 함수 대입하기

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()
    }
    
 }

코드를 분석하다가 저렇게 괄호() 외부에 선언하는 방식이 낯설었는데요, 자주 사용하며 익혀둬야겠습니다 :)

반응형