JEP's Diary

코틀린 헷갈리는 함수 정리. let, apply, run, with 본문

Development/Kotlin

코틀린 헷갈리는 함수 정리. let, apply, run, with

지으니88 2019. 2. 2. 21:13

코틀린 헷갈리는 함수 정리. let, apply, run, with


1. let

let 함수를 호출하는 객체를 블록의 인자로 넘기고, 블록의 결과값을 반환한다.

또한 널 처리(if (a != null) 를 대신할 수 있다.


inline fun <TR> 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 <TR> 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 <TR> with(receiver: Tblock: 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