[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개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN