본문 바로가기
개발언어/Kotlin : 코틀린

코틀린 익히기 12 - Scope Function

by 개발자D 2023. 10. 6.

코틀린 익히기12 - Scope Function

표준함수

표준 라이브러리에 포함되어 있는 함수를 표준함수라고 합니다. 코틀린의 표준함수는 람다식과 고차함수를 이용해 선언되어 있습니다. 표준함수를 사용하면 코드를 더 간결하고 쉽게 바꿀 수 있습니다. 어떤 함수들이 선언되어 있고, 어떻게 사용할 수 있는지 공부해 봅시다.

 

 


스코프 함수 Scope Function

스코프 함수는 Kotlin 표준 라이브러리에서 제공하는 표준 함수입니다.

코드 블록을 실행하는 것이 유일한 목적이며, 성능 최적화를 위해 모두 inline으로 선언되어 있습니다.

 

스코프 함수에는 let, also, apply, run, with가 있습니다. 

 

let() 

In : 함수를 호출하는 객체 Out : 결괏값

public inline fun <T, R> T.let(block: (T) -> R): R { return block(this) }

함수를 호출하는 객체를 람다식에서 it으로 받아 결괏값을 반환하는 함수입니다.


 사용 목적

객체의 특정 연산을 수행한 후 다른 값을 반환하거나, 널 안전성 체크와 함께 코드를 실행할 때 사용됩니다.

 

⭐ 사용 예시

nullOrNotNull?.let { print("$it")} ?: print("null")

 

 

also() 

In : 함수를 호출하는 객체 Out : 함수를 호출하는 객체

public inline fun <T> T.also(block: (T) -> Unit): T { block(this); return this }

let처럼 함수를 호출하는 객체를 람다식에서 it으로 받아 처리하지만, 결괏값 대신 객체를 다시 반환하는 함수입니다.


 사용 목적

객체의 상태를 변경하지 않고 부가적인 작업(로그 남기기, 유효성 검사 등)을 수행할 때 사용됩니다. 객체 자체를 반환합니다.

 

  사용 예시

fun main() {
    var result = 3
    println( result.also { println(it + 3) } ) 
}

//6
//3

 

 

apply() 

In : 함수를 호출하는 객체 Out : 함수를 호출하는 객체

public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }

also와 같은 방식으로 동작하나, 객체를 받을 때 it이 아닌 this로 받습니다. 이 this는 생략이 가능합니다. 

 

 사용 목적

객체를 생성하거나 설정할 때, 객체의 상태를 변경한 후 그 객체 자체를 반환하는 데 사용됩니다.

 

  사용 예시

data class Person (var name: String, var age: Int) {
    fun walk() { println("walking...") }
}

fun main() {
    val person = Person("d", 20)
        person.apply {
            name = "haru"
            age = 30
            walk()
        }
    println(person)
}

// walking...
// Person(name=haru, age=30)

 

 

run() 

In : X Out : 결괏값

public inline fun <R> run(block: () -> R): R = return block()

In : 함수를 호출하는 객체 Out : 결괏값

public inline fun <T, R> run(block: T.() -> R): R = return block()

 

객체에서 호출하지 않을 때는 익명함수처럼, 객체에서 호출할 때는 let처럼 사용할 수 있습니다. 대신, 람다식에서 함수를 호출하는 객체를 it이 아닌 this로 받습니다. 이 this 역시 생략이 가능합니다.

 

 사용 목적

객체에 대한 여러 연산을 연속적으로 수행한 후 결괏값을 반환할 때 사용됩니다.

 

  사용 예시

data class Person (var name: String, var age: Int) {
    fun walk() = run { println("walking...") }
}

fun main() {
    val person = Person("d", 20)
        person.run {
            name = "haru"
            age = 30
            walk()
        }
    println(person)
}

// walking...
// Person(name=haru, age=30)

 

 

with() 

In : 함수를 호출하는 객체 Out : 결괏값 

public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()

run과 같은 방식으로 동작하나 객체에서 함수를 호출하지 않고, 객체 자체를 매개변수로 넘겨 사용한다는 점에서 차이가 있습니다.

with() 함수는 세이프콜을 지원하지 않습니다. 

 

 사용 목적

주어진 객체의 메서드나 프로퍼티에 여러 번 접근할 때 객체를 명시적으로 참조하지 않고 연속적으로 사용하기 위해 사용됩니다.

 

  사용 예시

data class Person (var name: String, var age: Int) {
    fun walk() { println("walking...") }
}

fun main() {
    val person = Person("d", 20)
        with(person) {
            name = "haru"
            age = 30
            walk()
        }
    println(person)
}

// walking...
// Person(name=haru, age=30)

 


use() 

In : 함수를 호출하는 닫을 수 있는 객체  Out : 결괏값 

public inline fun <T : Closable?, R> T.use(block: (T) -> R): R

사용 후 닫아줘야 하는 객체에 use 함수를 사용하면 자동적으로 close()를 호출하여 편리합니다. 객체를 it으로 받아 결괏값을 반환합니다.

 

  사용 예시

PrintWriter(FileOutputStream("E:\\hello.txt")).use {
    it.println("kotlin")
}

코틀린의 대표적인 표준 함수, 스코프 함수 6가지를 알아보았습니다. 스코프 함수를 잘 사용하면 코드를 훨씬 간결하고 아름답게 만들 수 있습니다. 다음 글은 입출력에 대해 다룹니다.

 

코틀린 익히기 13 - 입출력

자바 쉽게 배우기 22 - 입출력 스트림 스트림 스트림은 물줄기를 의미합니다. 입출력 스트림 또한 입출력을 위한 흐름을 의미합니다. 데이터는 출발지에서 목적지로 향합니다. 이 향하는 길을 이

devdharu.tistory.com