일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 도심공항
- 그라나다
- 지팍스페인
- cocoapod
- Device 등록
- 스쿠버다이빙
- 연금저축펀드
- Gradle
- 러브스플리트
- 세비야
- 공기먹는다이버스
- Cocoapods #PrivateRepo #SpecRepo
- 강릉
- 라이브러리
- Swift #Concurrency #쓰레드
- swiftUI
- 스페인광장
- 리브어보드
- 러브자그레브
- SwiftUI #Skeleton #데이터갱신
- Concurrency #Swift #Combine
- 스페인여행
- 스플리트
- 시밀란
- 푸켓여행
- 괌 자유여행
- xcode
- 대한항공
- 아시아나
- 크로아티아
- Today
- Total
JEP's Diary
코틀린 헷갈리는 함수 정리. let, apply, run, with 본문
코틀린 헷갈리는 함수 정리. let, apply, run, with
1. let
let 함수를 호출하는 객체를 블록의 인자로 넘기고, 블록의 결과값을 반환한다.
또한 널 처리(if (a != null) 를 대신할 수 있다.
inline fun <T, R> T.let(block: (T) -> R): R
- 사용규칙
: 널체크후 코드실행하고 싶을 경우,
: 블록 내의 결과물을 반환하고 싶을 경우.
: 단일 지역 변수의 범위를 제한하고싶을 경우.
@Test
fun blockTest() {
val person = Person("park", "jieun")
val result = person?.let {
printPerson(it.lastName + it.firstName)
}
Assert.assertEquals(result, "parkjieun")
}
private fun printPerson(msg: String): String {
println(msg)
return msg
}
2. apply
apply 함수를 호출하는 객체를 블록의 리시버로 전달하고, 객체 자체를 반환한다.
inline fun <T> T.apply(block: T.() -> Unit): T
- 사용규칙
: 수신객체 람다 내부에서 함수를 사용하지 않고
: 수신 객체 자신을 반환하는 경우.
: 대표적인 예는 객체 초기화.
@Test
fun applyTest() {
val person = Person("park", "jieun")
val result = person?.apply {
this.lastName = ""
this.firstName = ""
lastName = ""
firstName = ""
}
val result2 = Person().apply {
lastName = "park"
firstName = "jieun"
}
Assert.assertEquals(result, Person("",""))
}
3. run
run은 객체없이 호출하는 형태와, 객체에서 호출하는 형태가 나눌 수 있다.
객체 없이 호출하며 익명함수로 사용할 수 있으며, 블럭내에 처리할 작업들을 넣어주면 된다. 반환값도 가능하다.
inline fun <R> run(block: () -> R): R
run 함수를 호출하는 객체를 블록의 리시버로 전달하고, 블록의 결과 값을 반환한다.
inline fun <T, R> T.run(block: T.() -> R): R
이는 apply와 거의 비슷한데, apply는 객체를 생성함과 동시에 연속된 작업이 필요할 때 주로 사용하고,
run은 이미 생성된 객체에 연속된작업이 필요할 때 주로 사용한다. 그리고 apply와 반환 값이 다르다.
- 사용 규칙
: 어떤 값을 계산할필요가 있거나,
: 여러개의 지역변수의 범위를 제한
@Test
fun runTest() {
val isAdd: Boolean = run {
// 지역변수1
val person1 = Person("park", "jieun")
// 지역변수2
val person2 = Person("park", "jieun")
isAdd()
}
Assert.assertEquals(isAdd, true)
fun test(person: Person) = person.run {
// person을 수신객체로 변환하여 사용
printPerson(lastName + firstName)
}
test(Person("park", "jieun"))
}
4. with
인자로 받는 객체를, 블록의 리시버로 전달하고, 블록의 결과값을 반환한다.
inline fun <T, R> with(receiver: T, block: T.() -> R): R
run 함수와 거의 유사하며, 리시버로 전달할 객체가 어디 있는지가 다르고, with 함수는 안전한 호출(?.)를 지원하지 않는다.
- 사용규칙
: Non-Nullable 객체이여야하며,
: 결과가 필요하지 않은 경우.
@Test
fun withTest() {
val person = Person("park", "jieun")
with(person) {
printPerson(lastName + firstName)
}
}
'Development > Kotlin' 카테고리의 다른 글
Sealed Class (0) | 2022.02.25 |
---|---|
3.자바와는 다른 코틀린의 특징 (0) | 2019.01.01 |
2. 자바와 비교해 보는 코틀린 2 (0) | 2018.11.11 |
2. 자바와 비교해 보는 코틀린 1 (0) | 2018.08.31 |
1.코틀린이란? (0) | 2018.08.25 |