✔ 범위 지정 함수
범위 지정 함수는 특정 객체에 대한 작업을 블록 내에서 실행할 수 있도록 하는 함수이다.
- 블록은 특정 객체에 대한 작업의 범위를 나타낸다.
- 특정 객체에 대한 작업을 블록에 작성하면 가독성이 증가하고 유지 보수가 쉬워진다.
- 수신 객체 지정 람다(함수)라고도 하며, 블록 내에서는 수신 객체를 명시하지 않거나, it을 호출하는 것만으로 수신 객체가 호출된다.
- Kotlin에서는 apply, run, let, also, with 5가지를 지원한다.
❗❗ apply
◼ apply는 수신 객체 내부 프로퍼티를 변경한 다음, 수신 객체 자체를 반환하기 위해 사용되는 함수이다.
◼ 객체 생성 시, 다양한 프로퍼티를 설정해야 하는 경우 사용한다.
◼ apply에서는 수신 객체로 apply의 수신 객체(T)를 지정 (T.()), 이로 인해 수신 객체에 대한 명시가 없어도 된다.
val car = Car().apply {
name = "AVANTE"
price = 1000000
}
◼ Car 객체의 name과 price를 블록 내에서 지정하고 해당 객체 자체를 반환 받을 수 있다. 위와 같이 코드를 작성하면 프로퍼티를 설정할 때마다 변수명을 호출하지 않아도 되기 때문에, 다음과 같은 코드에 비해 가독성이 좋아진다.
val car = Car()
car.name = "AVANTE"
car.price = 1000000
❗❗ run
◼ run은 apply와 비슷하지만, 수신 객체를 Return하지 않고 블록 마지막 라인을 return하는 함수이다.
◼ 수신 객체에 대해 특정한 동작을 하고 결과 값을 리턴 받아야 할 경우 사용한다.
val result = listOf(1, 2, 3, 4).run {
reduce { total, item -> total + item }
} // 10
◼ list의 reduce 메서드 실행 결과를 받을 수 있다. 다음 코드에 비해 가독성이 좋아진 것을 알 수 있다.
val testList = listOf(1, 2, 3, 4)
val result = testList.reduce { total, item -> total + item }
❗❗ with
◼ with는 수신 객체에 대한 작업 후 마지막 라인을 return한다. run과 동일하게 동작하지만 수신 객체를 파라미터로 받아서 사용한다.
◼ run을 사용하는 것이 더 깔끔하므로, run을 주로 사용한다.
val testList = listOf(1, 2, 3, 4)
val result = with(testList) {
reduce { total, item -> total + item }
}
❗❗ let
◼ let은 수신 객체를 이용해 작업을 한 후, 마지막 줄을 return할 때 사용한다.
◼ run, with과의 차이점은 수신 객체에 접근할 때, it을 사용한다.
◼ let은 수신 객체의 함수(T.())를 받아서 사용하는 것이 아니므로 nullable한 수신 객체를 처리할 때 사용한다.
val result = findList(1).let {
it?.reduce { total, item -> total + item }
}
val result2 = findList(1)?.let {
it.reduce { total, item -> total + item }
}
val result3 = findList(1)?.run {
reduce { total, item -> total + item }
}
fun findList(value: Int): List<Int>? {
if (value == 1) {
return null
}
return listOf(1, 2, 3, 4)
}
◼ 위와 같은 상황에서는 컴파일 오류 없이 실행될 수 있다.
❗❗ also
◼ also는 apply와 같이 자기 자신을 반환한다.
◼ also는 apply와 달리 블록 내에서 수신 객체의 함수(T.())이 아닌 T 수신 객체 자체를 받기 때문에 it으로 접근해야 한다.
◼ 수신 객체를 받기 때문에, 객체의 속성을 전혀 사용하지 않거나 변경하지 않는 경우 사용한다.
Car(name = "AVANTE").also {
print(it.name)
}
📒 정리
apply: 객체 정보에 접근 및 작용
with, run: 객체 정보 관리 및 객체에 비즈니스 로직 수행
let: 연산의 체이닝
also: 옅은 성격의 부가 비즈니스 로직 수행
'Kotlin' 카테고리의 다른 글
[Kotlin] 기본 문법 (4) (0) | 2022.10.28 |
---|---|
[Kotlin] 기본 문법 (3) (0) | 2022.10.27 |
[Kotlin] 기본 문법 (2) (0) | 2022.10.25 |
[Kotlin] 기본 문법 (1) (0) | 2022.10.23 |
[Kotlin] Kotlin이란? (0) | 2022.10.21 |