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!" 문자열을 참조합니다.
'Language > 코틀린' 카테고리의 다른 글
코틀린 Csv file read, file read (0) | 2023.05.19 |
---|
댓글