스코프 함수를 이해하기 위해 고차함수, 람다에 대해 알아보자
1 fun 더하기_함수(a : Int, b : Int){ return (a + b); }
2 fun 3곱하기_고차함수(func : (Int, Int) -> Int){
print( func(1, 2) * 3 )
}
3 <<main>>
3곱하기_고차함수(::더하기_함수)
4 <<출력>>
9
어떤 코드인가
생소한 함수 자료형
위에서 Kotlin의 함수는 일급 객체라고 설명했고, 함수도 클래스처럼 인스턴스화될 수 있다고 설명했다.
우리는 이제 함수의 자료형이 어떻게 생겼는지 안다.
함수를 인스턴스화하여 변수에 저장해보자
var 더하기_함수 : (Int, Int) -> Int = ::더하기_함수```
그런데, 인자로 넘길 함수를 굳이 이름까지 붙여 따로 만들 필요가 있을까?
"람다함수의 등장"
말그대로 함수의 이름을 작성하지도, 따로 만들지도 않겠다는 것이다.
필요한 곳에서 즉시, '함수의 파라미터, 내용'만 작성하여 사용한다.
이 때 작성한 함수가 바로 람다함수이다.fun sum(a : Int, b : Int) : Int { return a + b }
{ a : Int, b : Int -> a + b } //위의 함수를 람다식으로 작성
//더하기_함수가 사라졌다!
fun 3곱하기_고차함수(func : (Int, Int) -> Int){
print( func(1, 2) * 3 )
}
<<main>>
3곱하기_고차함수( {a, b -> a + b} ) //람다식의 마지막 줄(a+b)이 람다식의 반환값이다.
<<출력>>
9
Android Studio에서 코틀린으로 개발을 해봤던 사람이라면, 고차함수와 람다식 형태를 봤던 적이 아마도 있을 것이다. Button의 클릭 이벤트를 처리하는 경우 고차함수+람다의 형태를 가진다.
button1.setOnClickListener( View.OnClickListener() {
override fun onClick(view : View!){
//클릭 이벤트 처리 내용
})
- Register a callback to be invoked when this view is clicked. If this view is not clickable, it becomes clickable.
- setOnClickListener() [developers]
- Interface definition for a callback to be invoked when a view is clicked.
- View.OnClickListener [developers]
- Called when a view has been clicked.
button1.SetOntClickListener{ v ->
//클릭 이벤트 처리 내용
}
코드가 비약적으로 줄어들었다. 코드를 살펴보자.
View.OnClickListener()는 어디로 갔나요?
SAM(Single Abstract Method) 변환
- 함수가 하나뿐인 자바의 인터페이스나 클래스의 익명객체를 람다식으로 표현 가능합니다.
- 단, Java에서 작성한 Interface 정의와 이를 활용하는 setOnClickListener를 kotlin에서 부르는 경우에만 SAM이 동작합니다.
View.OnClickListener는 원래 자바의 인터페이스이고 가지고 있는 구현 메소드가 한개(onClick) 뿐이므로 익명객체로 생성 및, 구현 메소드 onClick()을 손쉽게 구현 받아 람다식으로 표현하는 것이 가능하다.
button1.setOnClickListener({ v -> //클릭 이벤트 처리 내용 })
이 때 v는 onClick(view : View!)의 파라미터 view를 의미한다.
소괄호는.. 어디 갔나요?
p.s : 선택적 수용을 지향합니다. 오류가 있을 수 있습니다.