본문 바로가기

Kotlin

[Kotlin] 범위 지정 함수

범위 지정 함수

범위 지정 함수는 특정 객체에 대한 작업을 블록 내에서 실행할 수 있도록 하는 함수이다.
  • 블록은 특정 객체에 대한 작업의 범위를 나타낸다.
  • 특정 객체에 대한 작업을 블록에 작성하면 가독성이 증가하고 유지 보수가 쉬워진다.
  • 수신 객체 지정 람다(함수)라고도 하며, 블록 내에서는 수신 객체를 명시하지 않거나, 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