들어가기 전에
이제 표준 함수를 차근차근 배워 봅시다. 먼저 자주 사용되는 표준 함수의 종류를 살펴보고 let( )함수부터 알아보겠습니다.
핵심 키워드
- 코틀린 표준 함수
- 확장 함수 형태로 사용
- T는 형식 매개 변수로 어떤 타입도 사용할 수 있음
학습하기
들어가기 전에
이제 표준 함수를 차근차근 배워 봅시다. 먼저 자주 사용되는 표준 함수의 종류를 살펴보고 let( )함수부터 알아보겠습니다.
핵심 키워드
학습하기
코틀린의 표준 라이브러리
이제 람다식을 사용하는 코틀린의 표준 라이브러리에서 let(), apply(), with(), also(), run() 등 여러 가지 표준 함수를 활용해 코드의 효율을 높입니다. 이러한 함수를 통해 기존의 복잡한 코드를 단순화하고 효율적으로 만들 수 있습니다.
let() 활용하기
let()함수는 함수를 호출하는 객체 T를 이어지는 block의 인자로 넘기고 block의 결과값 R을 반환합니다.
// 표준 함수의 정의
public inline fun <T, R> T.let(block: (T) -> R): R { ... return block(this) }
T나 R과 같은 문자는 제네릭에서 배우게 될 내용이지만 간단히 설명하면 let( ) 확장 함수를 사용하기 위해 어떤 자료형이더라도 사용할 수 있도록 일반화한 문자입니다. 형식 매개변수라고 합니다. 예를 들면 정수형, 문자열, 특정 클래스의 객체등에 let()함수를 확장 함수로서 사용할 수 있게 된다는 것이죠.
val score: Int? = 32
...
// let을 사용해 null 검사를 제거
fun checkScoreLet() {
score?.let { println("Score: $it") } // ①
val str = score.let { it.toString() } // ②
println(str)
}
이 코드와 같이 let은 특정 선언 변수를 T요소로 받아 결정되었는데 여기서는 널 가능한 정수형 변수입니다. 이 변수는 다시 Int의 객체라고도 말할 수 있죠. 이것은 다음 강좌인 객체지향 편에서 다룰 것입니다. 여기에 let 함수로 확장함으로서 필요한 score를 it으로 받아서 후처리 하며 이것의 결과를 다시 반환해 str에 할당하게 되는 것입니다.
null 가능성 있는 객체에서 let() 활용하기
let을 세이프 콜(?.)과 함께 사용하면 if (null != obj)와 같은 null 검사 부분을 대체할 수 있습니다.
obj?.let { // obj가 null이 아닐 경우 작업 수행 (Safe calls + let 사용)
Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show()
}
따라서 이 코드는 obj가 널이 아닌 경우에만 let 블록 구문을 수행하고 널이면 아무런 일도 하지 않게 되므로 널 예외인 NPE를 방지할 수 있게 됩니다.
체이닝을 사용할 때 let() 활용하기
체이닝이란 여러 메서드 혹은 함수를 연속적으로 호출하는 기법입니다. 당연히 다음과 같이 let()함수를 체이닝 형태로 사용할 수 있습니다.
var a = 1
var b = 2
a = a.let { it + 2 }.let {
val i = it + b
i // 마지막 식 반환
}
println(a) //5
코드에서처럼 첫 번째 a.let {...} 블록의 처리 결과를 다시한번 let {...} 블록으로 넘겨서 처리할 수 있습니다. 이때 블록의 마지막 식이 반환됩니다. 코드의 가독성을 고려한다면 너무 많은 let을 사용하는 것은 권장되지 않습니다.
참고자료
http://www.yes24.com
생각해보세요.
앞서 공부한 세이프콜(.?)이 다시 나왔습니다. let과 세이프콜을 사용하면 null 검사 부분을 단순화 할 수 있었죠. let() 함수를 어디에 응용할 수 있을지 생각해 보시고 아이디어를 댓글을 통해 남겨 보세요!
comment
무슨말을 하는지 너무 어렵다
1. 지정된 값이 null 이 아닌 경우에 코드를 실행
2. 단일 지역 변수의 범위를 제한하여 가독성 향상
- Reference
kotlinlang.org/docs/scope-functions.html#let
let()을 어디에 사용해야하지? 라고 고민하고 있던 차에 안드로이드 예제를 보니 이해가 확 되네요!