본문 바로가기
Language/코틀린

apply, with, let, also, run ?

by 띵커베르 2024. 4. 7.
728x90

apply: 개체를 생성하거나 초기화 할때 주로 사용

val peter = Person().apply {

    // apply 의 블록 에서는 오직 프로퍼티 만 사용합니다!

    name = "Peter"

    age = 18

}

 

with: Non-nullable (Null 이 될수 없는) 수신 객체 이고 결과가 필요하지 않은 경우에만 with 를 사용합니다.

val person: Person = getPerson()

with(person) {

    print(name)

    print(age)

}

 

let: 지정된 값이 null 이 아닌 경우에 코드를 실행해야 하는 경우

getNullablePerson()?.let {

            // null 이 아닐때만 실행됩니다.

            promote(it)

}

val driversLicence: Licence? = getNullablePerson()?.let {

    // nullable personal객체를 nullable driversLicence 객체로 변경합니다.

    licenceService.getDriversLicence(it)

}

val person: Person = getPerson()

getPersonDao().let { dao ->

    // 변수 dao 의 범위는 이 블록 안 으로 제한 됩니다.

    dao.insert(person)

}

 

also: 수신 객체 람다가 전달된 수신 객체를 전혀 사용 하지 않거나 수신 객체의 속성을 변경하지 않고 사용하는 경우 also 를 사용합니다.

  also apply 와 마찬가지로 수신 객체를 반환 하므로 블록 함수가 다른 값을 반환 해야하는 경우에는 also 를 사용할수 없습니다.

  예를 들자면, 객체의 사이드 이팩트를 확인하거나 수신 객체의 프로퍼티에 데이터를 할당하기 전에 해당 데이터의 유효성을 검사 할 때 매우 유용합니다.

  class Book(author: Person) {

    val author = author.also {

      requireNotNull(it.age)

      print(it.name)

    }

}

 

run: 어떤 값을 계산할 필요가 있거나 여러개의 지역 변수의 범위를 제한하려면 run 을 사용합니다.

 매개 변수로 전달된 명시적 수신객체 를 암시적 수신 객체로 변환 할때 run ()을 사용할수 있습니다.

 val inserted: Boolean = run {

    // person personDao 의 범위를 제한 합니다.

    val person: Person = getPerson()

    val personDao: PersonDao = getPersonDao()

    // 수행 결과를 반환 합니다.

    personDao.insert(person)

}

fun printAge(person: Person) = person.run {

    // person 을 수신객체로 변환하여 age 값을 사용합니다.

    print(age)

}

 

 

apply(): 개체의 속성을 수정하고 수정된 개체를 반환하려는 경우.

with(): 개체를 수정하지 않고 개체에 대한 작업을 수행하고 결과를 반환하려는 경우.

let(): nullable 개체에 대한 작업을 수행하고 결과를 반환하려는 경우.

also(): 개체에 일부 부작용을 수행하고 동일한 개체를 반환하려는 경우.

run(): 개체에 대해 일부 작업을 수행하고 결과를 반환하고 싶고 후속 호출에서 개체를 참조할 필요가 없는 경우.

 

함수 객체참조 반환 값 사용 사례
let it 람다 결과 객체의 속성을 초기화하거나 수정하고, 수정된 객체를 반환하려는 경우.

예: 객체 생성 후 속성을 설정.
run this 람다 결과 객체를 수정하지 않고 객체에 대한 작업을 수행하고 그 결과를 반환하려는 경우.

예: 객체의 여러 메서드를 호출하고 그 결과를 계산할 때.
apply this 객체 자신 nullable 객체에 대한 작업을 수행하고 그 결과를 반환하려는 경우.

예: nullable 객체에 대해 null 검사를 수행하면서 동시에 연산을 수행.
also it 객체 자신 객체에 대해 부수효과를 수행하고 동일한 객체를 반환하려는 경우.

예: 객체 상태를 로깅하거나 다른 연산에 객체를 전달하기 전에 검증.
with this 람다 결과 객체에 대해 일부 작업을 수행하고 결과를 반환하며, 후속 호출에서 객체를 참조할 필요가 없는 경우.

예: 초기화된 객체에서 메서드를 호출하고 그 결과를 반환할 때.

 

좀 더 추가

 

  • let
    • 주로 nullable 객체에 대한 연산을 수행하거나, 변수의 범위를 지역적으로 제한할 때 사용.
    • let 은 호출된 객체(it)를 람다에게 전달하고 람다의 결과를 반환
    • null 검사와 함께 사용되는 경우가 많음
val result = nullableObject?.let {
    transform(it)
}

val length = "Hello, Kotlin!".let { it.length }
println(length)

 

  • run
    • 객체의 초기화와 결과를 계산할때 유용. let 과 비슷하지만 리시버(this)를 사용
    • run 은 주로 시비서 객체의 여러 메서드를 호출하고, 마지막에 결과를 반환할 때 사용한다.
    • 객체의 범위 내에서 연산을 수행하고자 할 때 사용하기도 함
// 객체의 초기화와 연산 수행
val result = "Hello".run {
    println(this) // this는 현재 문자열 "Hello"를 참조
    length // 람다의 결과 (이 경우 문자열 "Hello"의 길이)
} // result: Int (5)

 

  • apply
    • 주로 객체의 초기화에 사용
    • 리시버(this) 를 반환하기 때문에, 초기화 이후에 객체에 대한 연쇄 호출로도 주로 사용
val result = StringBuilder().apply {
    append("Hello, ")
    append("Kotlin!")
} // result: StringBuilder (수정된 자기 자신을 반환)
println(result.toString()) // "Hello, Kotlin!"

 

  • also
    • 주로 객체에 대한 부수효과를 처리할 때 사용. 리시버(it)을 반환
    • 호출된 객체 자신을 변경하지 않고 그대로 반환한다 즉 also 내에서 실행되는 코드는 객체에 대한 로깅, 검증 등 부수적인 작업을 위한 것이며 이러한 작업의 결과가 also 함수의 반환 값에 영행을 주지 않는다.
val result = "Hello".also {
    println("Original: $it")
    it.reversed() // 이 연산의 결과는 무시됩니다.
} // result: String ("Hello", 원본 문자열을 반환)

 

  • with
    • 이미 초기화된 객체에 대해 연산을 수행하고 그 결과를 반환할 때 사용
    • 주어진 객체의 컨텍스트 내에서 여러 연산을 수행하고, 마지막에 개선된 결과를 반환하려고 할대 유용 함
val message = with(StringBuilder()) {
    append("Hello, ")
    append("Kotlin!")
    toString() // 마지막에 toString()을 호출하여 StringBuilder 객체에서 String 결과를 반환
}
// message는 "Hello, Kotlin!" 문자열을 참조합니다.

 

 

 

참고: https://medium.com/@limgyumin/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%9D%98-apply-with-let-also-run-%EC%9D%80-%EC%96%B8%EC%A0%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EA%B0%80-4a517292df29

728x90

'Language > 코틀린' 카테고리의 다른 글

코틀린 Csv file read, file read  (0) 2023.05.19

댓글