-
[Android][Kotlin] apply, let, also, with, run 함수 정리안드로이드 2021. 7. 15. 19:54728x90반응형
코틀린 강의를 듣던 중에 let함수가 나와서 공부하는 중에 너무 어려워서 이렇게 정리해보면 이해가 쉽지 않을까 싶어 정리해본다.
범위 지정 함수
먼저 apply, let, also, with, run 이렇게 5가지 함수들을 모두 범위 지정 함수라고 한다. 람다식이 제공된 객체에서 범위 지정 함수를 호출하면 임시 범위가 형성되는데, 이 범위에서 이름 없이 객체에 접근할 수 있다. 이러한 기능을 가진 함수를 범위 지정 함수라고 한다.
범위 지정 함수들의 공통적인 기능을 수행한다.
객체에서 코드 블록을 실행하는 기능이다.
그렇다면 범위 지정 함수의 각각 특징을 알아보자.
1. apply()
객체를 생성과 동시에 property값을 초기화하고 자기 자신을 반환하는 함수이다.
기존 방식
val k3 = Car("k3") k3.price = 3000 k3.brand = "kia"
apply 함수 사용 시
val k3 = Car("k3").apply{ price = 3000 brand = "kia" }
apply 함수 사용하는 이유
- 우리가 사용할 객체를 구성할 때 반복되는 코드 양을 줄이기 위해
- 특정 객체를 생성함과 동시에 초기화해줄 때
2. let()
함수를 호출한 객체를 인자로 받아 다른 메서드를 실행하거나 연산을 수행해야 하는 경우 수행
주로 객체가 null이 아닌 코드를 실행하는 경우 사용.
val str: String? = "Hello" //processNonNullString(str) // compilation error: str can be null val length = str?.let { println("let() called on $it") processNonNullString(it) // OK: 'it' is not null inside '?.let { }' it.length }
let 함수 사용하는 이유
- 호출 체인 결과에서 하나 이상의 함수를 호출하고 싶을 때
- null 체크 후 코드를 실행하기 위해(지정된 값이 null이 아닌 경우에 코드 실행)
- 단일 지역 변수의 범위를 제한하고 싶을 때
- 블록 내의 결과물을 반환하고 싶을 때
3. also()
수신 객체 람다가 전달된 수신 객체를 전혀 사용하지 않거나, 속성 변경을 허용하지 않고 로그를 출력해 값의 유효성을 검증하고 싶을 때 사용.
나도 모르게 저지르는 실수를 차단하고 싶을 때 유용하다고 한다.
val numbers = mutableListOf("one","two","three") numbers.also{println("The list elements before adding new one : $ it")} .add("four")
also 함수 사용하는 이유
- 디버그 정보 로깅 또는 인쇄 같이 오브젝트를 변경하지 않는 추가 조치에 사용
4. with()
with()는 비 확장 함수이다. context 객체를 인자로 직접 전달받고, 람다 내부에서 이를 수신자로 사용.
결과가 필요하지 않을 경우 사용.
안전한 호출 지원하지 않는 함수로 run과 동일하지만 리시버로 전달할 객체가 어디에 위치하는지만 다르다.
val numbers = mutableListOf("one", "two", "three") with(numbers) { println("'with' is called with argument $this") println("It contains $size elements") }
with 함수 사용하는 이유
- Non-Nullable 객체여야 할 때
- 결과 값이 필요하지 않은 어떤 동작을 해야 할 때
5. run()
이미 생성된 객체의 메서드나 필드를 계산할 필요가 있거나, 여러 개의 지역 변수의 범위를 제한하기 위해 사용하는 함수.
with함수를 좀 더 편리하게 사용하기 위해 let함수와 with함수를 합쳐놓은 형태
형태
1. 인자가 없는 익명 함수처럼 동작하는 형태
val hexNumberRegex = run { val digits = "0-9" val hexDigits = "A-Fa-f" val sign = "+-" Regex("[$sign]?[$digits$hexDigits]+") }
2. 객체에서 호출하는 형태 객체의 값의 접근을 쉽게 할 때( 이미 생성된 객체의 메서드나 필드를 연속적으로 호출하거나 값을 할당할 때 사용
val service = MultiportService("https://example.kotlinlang.org", 80) val result = service.run { port = 8080 query(prepareRequest() + " to port $port") } //let() 사용한 같은 코드 val letResult = service.let { it.port = 8080 it.query(it.prepareRequest() + " to port ${it.port}") }
반응형참고
https://salix97.tistory.com/224
https://selfish-developer.com/entry/%EC%BD%94%ED%8B%80%EB%A6%B0-apply-also-let-run-with728x90반응형'안드로이드' 카테고리의 다른 글
[Android] 안드로이드 4대 컴포넌트 (0) 2022.01.03 [Android] 안드로이드 View Binding(뷰바인딩) (2) 2021.12.22 [Android][Kotlin] BCrypt 암호화 알고리즘 (0) 2021.07.16 [Android][Kotlin] : Retrofit (MVVM 코루틴) (0) 2021.07.15 [Android][Kotlin] : PendingIntent 란? (0) 2021.07.15