-
💡 [Kotlin/코틀린] let 함수가 뭐죠?| 프로그래밍 분야/Kotlin 2021. 6. 28. 15:19
let 함수의 정의
fun <T, R> T.let(block: (T) -> R): R
let 함수는 타입 T의 확장함수입니다.
따라서 모든 타입의 객체에 Chain Method(점(.)으로 이어나가는) 방식으로 사용할 수 있습니다.
반환 타입도 참조형 타입 R로 선언되어, 어떤 타입도 반환 타입도 가질 수 있으며, 반환값을 갖지 않을 수도 있습니다. (참조형 타입에 대한 설명은 위 링크에서 확인하실 수 있습니다.)
let 함수의 특징 및 용례
let 함수는 람다식으로 중괄호를 채워 이용합니다.
let 함수는 스스로의 객체를 인자로 받아 사용합니다.
또한, 중괄호 내부에서 해당 객체를 it 키워드로 호출할 수 있습니다.
fun main() { val a:String = "m" // 먼저, let 함수를 사용할 객체를 선언합니다. a.plus("e").plus("o").plus("ru").let { it.plus("1"); print(it) } // 기존 코드 // a.plus("e").plus("o").plus("ru").plus("1"); print(a.plus("e").plus("o").plus("ru").a) }
[출력] meoru
이와 같이, 코드의 길이가 길어지거나 중복 호출될 때 let 메서드를 사용하여 코드를 간결하게 할 수 있습니다.
it 키워드가 아닌, 인자의 이름을 직접 명명하여 사용할수도 있습니다.
fun main() { val a:String = "meoru" a.let { str -> str.plus("1"); print(str) } }
[출력] meoru
세이프콜(Safe Call, "?.")을 이용하여 객체가 null인 경우를 따로 처리해줄 수 있습니다.
fun main() { var str:String? = null str?.let {str = "-tech"}?: run{ str = "meoru" } print(str) str?.let {str = "-tech"}?: run{ str = "meoru" } print(str) }
[출력] meoru-tech
람다식 내부의 마지막 줄에 식이 아닌 변수나 객체 단일로 존재할 시, 그 값이 곧 반환값이 됩니다.
또한, it 키워드는 let 함수 내부에서 앞의 객체를 val 타입으로 복사하여 사용하는 것으로, 동일한 데이터를 갖지만 다른 주소를 참조합니다. 따라서 아래와 같이 it의 데이터를 수정하려고 할 시 오류가 발생할 수 있습니다.
fun main() { var str:String = "-tech" println (str.let { str = "meoru" // it = "meoru" <Error!> str + it }) }
[출력] meoru-tech
Reference
https://kotlinlang.org/docs/scope-functions.html#context-object-this-or-it