Kotlin Scope function, Receiver function

2025. 11. 7. 11:34Programming

    목차
반응형

일반적인 함수 타입

val func: () -> Unit = {
    ...
}

val func: (String) -> Int = { str ->
    str.length
}

func("hello")  // 5

스코프 함수

객체의 범위 내에서 코드 블록을 실행
특정 객체를 스코프(범위)에 넣고 작업

Kotlin 기본 제공 5개의 스코프 함수

|---|---|---|
| | name | 특징 | 기타 |
|1| apply | 자기 자신을 this로 설정 후 자신을 반환 | 체이닝 가능 |
|2| also | 쿠가 작업 수행 | it으로 자신을 접근 설정 후 자신을 반환 | 체이닝 가능 + it을 사용해서 좀 더 명확 |
|3| let | 변환 | it으로 자신을 접근해서 어떤 값을 명시적으로 반환 | 보통 반환되는 값이 변환 값 |
|4| run | 계산 변환 | this로 자신을 접근해서 어떤 값을 명시적으로 반환 | it로 접근하지 않아 코드가 더 단순화 됨 |
|5| with | 계산 변환 | run과 동일 | 예전 부터 있던 기능 |

also

apply는 객체 설정 시 사용됩니다.
자기 자신을 반환합니다.

val textView = TextView(context).apply {
    text = "Hello"
    textSize = 16f
    setTextColor(Color.BLACK)
}.also {
    layout.addView(it)  // textView 객체 사용
}

apply는 this를 생략할 수 있기 때문에 동일 변수명이 사용된 경우 헷갈릴 수 있다.

체이닝 가능

// 체이닝
person.apply {
    name = "John"
}.apply {
    age = 30
}.apply {
    address = "Seoul"
}

also

also는 부가 작업 (또한 이런것도 수행해...)

val file = File("a.txt")
    .also { println("${it.name}") }
    .also { println("${it.length()}) }

let

let은 변환

val length = "Hello".let {  // let은 현재 객체로 변환 (해서 반환)
    it.length
}

run

run은 복잡한 초기화
명시적 리턴 값을 반환

val isValid = person.run {
    updateAge(30)
    validate() // boolean 반환
}

with는 같은 객체 메서드 반복 호출

val res = with(person) {
    getName() + getAget()
}

리시버 함수 타입

val func: String.() -> Int = {
    length
}

val len = "hello".func()

this를 생략할 수 있으며, 물론 this.로도 접근 가능
실제 객체를 통해 리시버 함수를 호출해야 한다는 것에 주의

리시버 함수와 스코프 함수 혼합 예

반응형

'Programming' 카테고리의 다른 글

Kotlin: flatMapLatest  (0) 2025.11.07
오픈소스 라이센스  (0) 2022.12.13
Makefile %.o: %.cpp pattern  (0) 2022.09.29
cmake 옵션(option) 사용  (0) 2022.09.27
build shared lib on macOS  (0) 2022.09.27