반응형
람다식은 코틀린이 가지고 있는 특별한 함수의 형태다.
람다식을 적절히 이용하면 훨씬 간결한 코드 작성이 가능하다.
<람다식이란>
다음 코드는 람다식의 기본적인 예시이다.
result1, result2, result3는 모두 동일한 결과를 갖게 된다.
// 일반 함수 활용
fun add1(a:Int, b:Int):Int{
return a+b
}
val result1 = add1(10,10)
fun add2(a:Int,b:Int) = a+b
val result2 = add2(10,10)
//람다식 활용
val add3 = {a:Int, b:Int -> a+b}
val result3 = add3(10,10)
add3라는 변수는 람다식을 할당받았다. 이렇게 람다식은 함수의 의미를 갖지만 변수에 할당이 가능하다.
람다식은 기본적으로 { -> } 를 사용하며 화살표 좌측이 대입할 변수, 화살표 우측이 반환 값을 뜻한다.
그리고 사용할 때는 변수지만 함수를 포함하므로 변수이름 뒤에 ( )를 붙이고 그 안에 인자를 넣어준다.
<다양한 람다식의 형태>
fun main(){
var result: Int
val multi = {x: Int, y: Int -> x*y}
result = multi(20,30)
println(result)
}
# 생략 없는 기본형
val multi: (Int, Int)->Int = {x:Int, y:Int -> x*y}
# 선언 자료형 생략 가능
val multi = {x: Int, y: Int -> x*y}
# 람다식의 매개변수 자료형 생략 가능
val multi: (Int, Int)->Int = {x,y -> x*y}
# 아래 코드처럼 둘 다 생략은 불가능!! --> 오류 발생
val multi = {x,y -> x*y}
<람다식의 활용>
val addFunc = {a:Int, b:Int -> a+b} // 람다식을 만들어서 변수에 할당, 변수지만 함수의 역할을 함
val subFunc = {a:Int, b:Int -> a-b} // 람다식을 만들어서 변수에 할당, 변수지만 함수의 역할을 함
fun cal(a:Int, b:Int, oper:(Int, Int) -> Int):Int { //oper라는 파라미터의 자료형은 함수
return oper(a,b)
}
val result1 = cal(10,10,addFunc)
val result2 = cal(10,10,subFunc)
아래와 같이 어떤 함수의 반환값으로 람다식함수를 넘겨줄 수도 있다. 위 코드와 아래 코드는 동일한 결과를 나타낸다.
fun getOper(name:String): ((Int, Int)->Int)?{ // 함수의 반환값의 자료형은 람다식함수
var oper: ((Int,Int)->Int)? = null
if (name == "add"){ // name에 따른 람다식 을 oper에 할당
oper = {a:Int, b:Int -> a+b}
}else if (name == "subtract") {
oper = {a:Int, b:Int -> a-b}
}
return oper // 함수를 반환
}
val addFunc = getOper("add")
val subFunc = getOper("subtract")
fun cal(a:Int, b:Int, oper:(Int, Int) -> Int):Int {
return oper(a,b)
}
val result1 = cal(10,10,addFunc!!)
val result2 = cal(10,10,subFunc!!)
더 간단하게는 아래와 같이 작성이 가능하다.
함수를 사용할 때 그 함수의 마지막 인자가 람다식이라면 그 인자를 따로 빼서 { } 에 람다식으로 작성할 수 있다.
fun cal(a:Int, b:Int, oper:(Int, Int) -> Int):Int {
return oper(a,b)
}
val result1 = cal(20,10){a:Int, b:Int -> a+b}
val result2 = cal(20,10){a:Int, b:Int -> a-b}
댓글