-
[Kotlin]범위 지정 함수(apply, run, with, let, also)Kotlin 2023. 3. 26. 22:26반응형
[모든 포스팅은 개인적 공부를 위해 작성된 글입니다]
<범위 지정 함수(Scope Function)란?>
- 특정 객체에 대한 작업을 블록 안에 넣어 실행할 수 있도록 하는 함수
- 즉, 블록은 특정 객체에 대한 작업의 범위가 되므로 범위 지정 함수라고 부름
- 다른 말로 수신객체 지정 람다(함수)라고도 부름
- 수신객체를 명시하지 않거나 it으로 접근하는 것만으로도 람다 안에서 수신객체의 메서드를 호출할 수 있도록 하기 때문
- 이것이 가능한 이유는 블록 람다식에서 수신객체를 람다의 입력 파라미터 또는 수신객체로 사용했기 때문
- 장점 : 코드 간결화, 가독성 증가
<apply>
- 수신객체 내부 프로퍼티 변경 후 수신객체 자체를 반환받기 위해 사용하는 함수
- 리턴값 : 수신객체 자체
- 수신객체 접근 : 블록에서 명시하지 않거나 this를 사용해서 접근 가능
val member = new Member() member.id = "abcd" member.name = "efg"
- 위의 코드를 apply를 사용해서 아래와같이 간단하게 바꿀 수 있음
val member = Member().apply{ member.id = "abcd" member.name = "efg" }
<run>
- apply와 동일하게 동작하지만 수신 객체 대신 블록의 마지막 줄 리턴
- 리턴값 : 블록의 마지막 줄
- 수신객체 접근 : 블록에서 명시하지 않거나 this를 사용해서 접근 가능
data class Member( var id: String, var name: String ){ fun nameLength(): Int = name.length } val member = Member(id = "abcd", name = "efg") val name_length = member.run{ name = "hijk" nameLength() } println(name_length)//결과값 4
<with>
- run과 완전히 동일하게 작동하지만 run은 확장 함수로 사용되지만 with는 수신객체를 파라미터로 받아 사용
- run이 더 깔끔해 with는 잘 사용하지x
- 리턴값 : 블록의 마지막 줄
- 수신객체 접근 : 블록에서 명시하지 않거나 this를 사용해서 접근 가능
val member = Member(id = "abcd", name = "efg") val name_length = with(member){ name = "hijk" nameLength() } println(name_length)//4
<let>
- 수신객체 작업 후 마지막 줄 리턴할 때 사용
- null check 후 코드를 실행해야하거나 nullable한 수신객체를 다른 타입의 변수로 변환해야 하는 경우 사용(즉, nullable한 값을 다룰 때는 반드시 let 사용)
- nullable하지 않은 값에 let을 사용해도 되지만 실무에서는 일반적으로 run 사용
- ? 연산자와 함께 사용해야 함
- ?.let을 사용하면 수신객체가 null이 아닐 때만 블록 안의 내용 실행됨- 리턴값 : 블록의 마지막 줄
- 수신객체 접근 : 블록에서 it으로 접근 가능(수신객체를 람다의 파라미터로 전달하기 때문)
val member: Member? = null val 변수명 = name?.let { it: Member -> }
<also>
- apply와 비슷하지만 수신객체에 대한 추가적인 작업(로깅, 유효성 검사, 값 변환)을 한 후 객체를 반환할 때 사용
- 리턴값 : 수신객체 자체
- 수신객체 접근 : 블록에서 it으로 접근 가능(수신객체를 람다의 파라미터로 전달하기 때문)
var num = 3 fun increaseNum() = num.also{ num++ } println(increaseNum())//3 출력 println(increaseNum())//4 출력
- 한번 더 ++되어 4가 되는 것을 원하지 않는 경우 num = num.copy(num = it.num + 1)을 사용해야 함
*참고*
반응형'Kotlin' 카테고리의 다른 글
[Kotlin]확장 함수(Extension Functions) (0) 2023.04.20 [Kotlin]람다표현식 (0) 2023.03.26 [Kotlin]데이터 클래스(Data Class) (0) 2023.03.26