[자바/코틀린] Scope functions: let

Lee Yongin·2023년 3월 30일
1

자바/코틀린

목록 보기
3/5
post-thumbnail

코드를 만들다보면 가끔 경고가 뜬다.
무지성으로 Wrap with '?.let(...)'call을 누르면 알맞은 문법으로 자동완성이 된다. 그래서 자주 나타나는 이 let이 무엇인지 알아보았다.

let은 scope functions의 일종이며 범위 지정함수라는 뜻이다. let과 같은 scope function은 자동 오류고침을 써서 얻은 코드일 때가 많아서 헷갈린다.

let

let함수의 정의

fun <T, R> T.let(block: (T) -> R): R

let 함수는 타입T의 확장함수이다.반환 타입은 참조형 타입R이다. 어떤 타입도 반환타입을 가질 수 있고, 안 가져도 된다. 또한 non-null 객체에만 적용 가능하다.

var person = Person("yongin", 20)
val nameStr = person.let {
    it.name
    it.age
}

person은 클래스 Person의 인스턴스이다. person에 적용한 확장함수 let에서 참조하는 객체는 it인데, it은 person을 val타입으로 복사한 것이다. 따라서 동일한 데이터를 갖지만 다른 주소에 위치한다. it자체는 수정불가하지만, it이 참조한 데이터는 수정가능하다.

적합한 사용방법

let을 사용하면 불필요한 선언을 방지해서 코드가 간략해진다.
한 번 정도만 사용할 작은 함수가 있다면, 그 함수의 매개변수가 1개라면 let이 유용하다.

//let을 쓴 경우
Person("yongin", 20).let{
	Toast.makeText(context, it.name, Toast.LENGTH_SHORT).show()
    setStudent(it)
}

//let을 안 쓴 경우
var person = Person("yongin", 20)
Toast.makeText(context, person.name, Toast.LENGTH_SHORT).show()
setStudent(person)

let과 함께 자주 접하는 Safe Cells '?.'

개인적으로는 코드를 짜다가 .let 자동완성을 접하는 이유는 null체크 때문이다. 아래의 캡처를 보면 알 수 있다. String인데 내가 준 건 String일수도 있고 null일 수도 있는 객체기 때문에 해결방안으로 ?.let{}을 Wrapping 시키려고 하는 것 같다.

1.Safe Calls과 let{}을 함께 사용하는 경우

2.직접 null체크를 하는 경우

확실히 먼저 보인 코드가 간결하다. 이런 부분에서 .let{}은 코드를 간결하게 해준다는 걸 느꼈다.

정리

코틀린 공식문서에 따르면 let은 이렇게 사용해야 한다고 했는데 위의 예제들을 다시 한번 보니까 non-null 객체에서 람다를 실행하는 걸 볼 수 있다. 또한 it이 참조하는 데이터들을 지역적인 범위에서의 변수로서 사용할 수 있다는 점이 두번째 문장의 뜻이 아닐까 싶다.

1.Executing a lambda on non-null objects: let
(null이 아닌 객체에서 람다 실행: let)
2.Introducing an expression as a variable in local scope: let
(로컬 범위의 변수로 표현식 도입: let)

참고자료

코틀린 공식문서-scope function
let함수가 뭐죠?
코틀린의 유용한 함수들
코틀린 let, with, run, apply, also 차이 정리

profile
⚡개발자할거야 응애 안드로이드 개발자 ⚡p.s.기록만이 살길이다!

0개의 댓글