Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

기록장

[코틀린] 람다(Lambda) 표현식 본문

코틀린

[코틀린] 람다(Lambda) 표현식

edit0 2021. 3. 17. 23:46

람다는 기존의 코딩 방식보다 조금 더 간결하게 표현할 수 있도록 도와주는 표현식입니다.

 

처음 람다를 접하게 되면 이걸 굳이 헷깔리게 이렇게 사용해야 하나 싶기도 하겠지만, (뭐든) 익숙해지면 스스로도 편하고 코드도 기존보다 간결해져서 좋을 것이라 생각됩니다.

 

코틀린에서 매개변수로 함수를 전달받고, 매개변수로 함수를 반환하는 고차 함수에도 람다 개념이 필요하므로 잘 알아두는 것을 권장합니다.

 

이 포스팅은 기본적인 람다 표현 방식을 소개합니다.

 


 

fun add(x:Int, y:Int): Int{
	Log.i("TAG", "${x+y}")
	return x + y
}

var result1 = add(1,10)

위 코드는 흔히 사용할 수 있는 함수 형태입니다.

add라는 함수가 하나있고, Int타입의 인자 x와 y를 받아서 x + y 값을 반환해줍니다.

 

문제없는 코드지만 이것을 람다 표현식으로 바꾸게 되면 아래 코드와 같이 됩니다.

var add = { x:Int, y:Int -> x + y }
Log.i("TAG", "result: ${add(1,10)}")

 Log 안에 add(1,10)을 호출하면 1과 10이 더한 결과 값이 반환될 것 입니다.

 

람다식은 { 매개변수 -> 함수내용 } 형태를 가지고 있습니다.

즉, x:Int, y:Int 가 fun add(x:Int, y:Int) 부분이 될 것이고 x+y 함수내용이자 반환 값이 됩니다.

 


 

여기까지 보셨으면 대충 람다 표현식이 어떤 것인지 느낌이 올 것 같습니다.

 

람다 표현식을 사용하는데 있어서 몇 가지 규칙이 있는데 위에 내용을 이해하셨다면 읽기 어렵지 않을 것이라 생각합니다.

 

1. 표현식은 { } 대괄호를 사용하여 묶어준다.

2. { } 대괄호 안에 화살표( -> ) 표시가 있다.

3. 화살표( -> )를 기준으로 왼쪽은 매개변수, 오른쪽은 함수내용이다.

4. 인자 타입을 선언해야 하며, 추론 가능할 땐 생략이 가능하다.

5. 표현식의 마지막 라인 값은 반환 값 이다.

 


 

1~5번 까지 숙지가 되셨다면 더 알아보도록 하겠습니다.

var add = { -> 1 + 10}
Log.i("TAG","${add()}")

위에 코드는 함수의 매개변수, 즉 인자가 없을 경우에 표현식 입니다.

이럴 경우에는 -> 를 제외하고 아래와 같이 생략하여 표현할 수 있습니다.

var add = { 1 + 10 }

 

추가로 5번 내용을 참고하여

var add = {
	var x = 1000

	Log.i("TAG","$x")
	20
}
Log.i("TAG","${add()}")

마지막 라인 값이 리턴 값이 됩니다. (출력 = 20)

 

지금까지 본 것들을 변수에 리턴 값을 할당해주는 방식이였습니다.

 


 

이제부터는 함수 타입으로 람다식을 알아보도록 하겠습니다.

 

아까 위에서 { 매개변수 -> 함수내용 } 형태를 기억하실 겁니다.

함수 타입에서는 매개변수의 타입과 함수내용의 타입을 { 매개변수 -> 함수내용 } 내용 앞에 붙여주기만 하면 됩니다.

그러면 (String) -> String = { str: String -> str+"추가 문자열"} 이런 형태가 됩니다.

 

즉, (String) -> String 은 함수타입 정의 + { str: String -> str + "추가 문자열" } 은 함수타입에 적합하도록 인수와 출력 값을 표현해줍니다. 

 

예시들을 보도록 하겠습니다.

var function: (Int) -> String = { x:Int -> "x: " + x }
Log.i("TAG", function(100))

//출력 값 -> x: 100

var function2: (Int) -> String = { x -> "x: "+ x }
Log.i("TAG", function2(100))

//출력 값 -> x: 100

var function3: (Int) -> String = { it -> "x: "+ it }
Log.i("TAG", function3(100))

//출력 값 -> x: 100

맨 첫 번째 function을 보면 설명과 같이 (Int) 타입으로 들어오는 인자와 String타입으로 반환되는 "x: " + x 을 보실 수 있습니다.

여기까지 보면 위에 설명과 똑같습니다.

 

그런데 나머지 두 예시를 보면 출력 값은 같은데 매개변수(인자) 부분이 살짝 다릅니다.

 

람다 표현식에서는 가능하다면 타입을 예측할 수 있고, 그에 따라 생략이 가능합니다.

 

함수타입에서 (Int) -> String 으로 입, 출력 값에 대한 타입이 다 정의되어 있으므로 뒤에 생략을 해준 것 입니다.

또한, 매개변수 it을 사용하여 입력 값(입력 인수)을 대신하여 사용할 수 있습니다.

 

이런 식으로 간략하게 표현할 수 있고, 상황에 따라 생략도 가능합니다.

 


 

응용이라 하기에 뭐하지만, 아래와 같이 객체를 이용하여 사용할 수 있습니다.

class User(var name:String, var age:Int){}

var ref_fun: (User) -> String = { user:User -> user.name }
Log.i("TAG", ref_fun(User("김철수",20)))

//출력 값 -> 김철수

var ref_fun2: (User) -> String = { it -> it.name } //{ it.name } 가능
Log.i("TAG", ref_fun2(User("김철수",20)))

//출력 값 -> 김철수

var ref_fun3: (User) -> Int = User::age
Log.i("TAG", "${ref_fun3(User("김하나",25))}")

//출력 값 -> 25

 

감사합니다.

 

참고. 깡샘의 코틀린 프로그래밍