[Effective Kotlin] 아이템 38. 연산 또는 액션을 전달할 때 인터페이스 대신 함수 타입을 사용하라

0

일반적으로 자바에서 액션이나 연산을 전달할때, SAM을 활용했다.

SAM이란, 메서드가 하나만 있는 인터페이스를 의미한다.

interface OnClick{
	fun clicked(view: View)
}

함수 타입을 사용하는 코드로 변경하면, 더 많은 자유를 얻는다.

fun setOnClickListener(listener : (View) -> Unit){

}
  • 람다 표현식 또는 익명함수로 전달
setonCLickListener {}
setonCLickListener {fun(view){}}
  • 함수 레퍼런스 또는 제한된 함수 레퍼런스로 전달
setonCLickListener (::println)
setonCLickListener (this::showUsers)
  • 선언된 함수 타입을 구현한 객체로 전달
class ClickListener : (View) -> Unit{
	override fun invoke(view: View){
    
    }
}

또한 type alias를 사용하면 파라미터도 이름을 가질수 있다.

typealias OnClick = (view: View) -> Unit
fun setOnClickListener(listener : OnClick) {}

여러 옵저버를 사용할때 고전적인 자바는 인터페이스를 기반으로 구현했다.

class CalenderView{
	var listner : Listener ? = null

	interface Listener{
		fun onDateClicked(date : Date)
    	fun onPageChanged(data : Date)
	}
}

API를 소비하는 사용자의 관전에선 함수 타입을 따로따로 갖는것이 훨씬 사용하기 쉽다.

class CalenderView{
	var onDateClicked : ((date: Date) -> Unit) ? = null
	var onPageChanged : ((date: Date) -> Unit) ? = null
	
}

언제 SAM을 사용하는것이 좋을까?

코틀린이 아닌 다른 언어에서 사용할 클래스를 설계할때이다.
이외의 경우에는 SAM보단 함수타입을 사용하라

profile
쉽게 가르칠수 있도록 노력하자

0개의 댓글