관리 메뉴

피터의 개발이야기

[Kotlin] Scope Functions (let, with, run, apply, also) 정리 본문

Programming/Kotlin

[Kotlin] Scope Functions (let, with, run, apply, also) 정리

기록하는 백앤드개발자 2024. 6. 25. 10:10
반응형

 

ㅁ 들어가며

ㅇ이번 글은 Kotlin의 5가지 주요 Scope Functions (let, with, run, apply, also)에 대해 정리하였다.

kotlin doc - scope function의 내용을 보고 정리하였다.

 

ㅁ  Scope Functions (let, with, run, apply, also) 요약

let: 객체를 인자로 받아 처리하며, 결과를 반환합니다. Null 체크에 유용하다.

with: 객체를 직접 입력받아 속성을 변경할 수 있으며, 여러 함수를 그룹화하는 데 사용된다.

run: 객체의 확장 함수로, 계산이 필요하거나 지역 변수 범위를 제한할 때 사용한다.

apply: 객체를 초기화하거나 변경할 때 주로 사용되며, 자기 자신을 반환한다.

also: 객체의 속성을 변경하지 않고 부가적인 작업(로깅, 유효성 검사 등)을 수행할 때 적합하다.

 

ㅁ Kotlin의 Scope Functions란

ㅇ Kotlin의 Scope Functions는 객체의 컨텍스트 내에서 코드 블록을 실행하는 데 사용된다.

ㅇ 이 함수들은 코드를 더 간결하고 읽기 쉽게 만들어준다.

 

# let, also, run은 scope function이다.

이들 함수는 [Kotlin] 널 안정성, Null safety에서도 정리하였다.

 

ㅁlet

컨텍스트 객체: `it`으로 참조
반환 값: 람다 결과
용도: null이 아닌 객체에 대해 작업을 수행하거나, 지역 변수를 제한된 범위 내에서 선언할 때 사용

// null인 경우 기본값
val name = person?.let { it.name } ?: "Default Name"

// let은 리스트의 크기를 출력하고 새 요소를 추가한 후 수정된 리스트를 출력
val numbers = mutableListOf("one", "two", "three", "four", "five")
numbers.let { 
    println("리스트의 크기는 ${it.size}")
    it.add("six")
    println("새로운 리스트: $it")
}

 

ㅁ run

컨텍스트 객체: `this`로 참조
반환 값: 람다 결과
용도: 객체 구성 및 결과 계산, 여러 지역 변수의 범위를 제한할 때 사용

// 내년 나이 계산
val ageNextYear = person.run { age + 1 }

// run을 사용하여 문자열의 첫 글자와 마지막 글자를 추출하고 새로운 문자열을 반환
val result = "Hello".run {
    val firstChar = first()
    val lastChar = last()
    "첫 글자는 $firstChar, 마지막 글자는 $lastChar"
}
println(result)

 

ㅁ with

컨텍스트 객체: `this`로 참조
반환 값: 람다 결과
용도: 객체의 여러 함수를 호출할 때 그룹화

// with를 사용하여 Person 객체의 속성에 쉽게 접근하고 수정할 수 있다.
data class Person(var name: String, var age: Int, var city: String)

val person = Person("Alice", 30, "New York")
with(person) {
    println("$name is $age years old and lives in $city")
    age++
    city = "London"
}
println("Updated person: $person")

 

ㅁ apply

텍스트 객체: `this`로 참조

반환 값: 컨텍스트 객체
용도: 객체 초기화 및 구성

// apply를 사용하여 객체를 생성하고 즉시 속성을 수정할 수 있다.
data class Car(var brand: String, var model: String, var year: Int)

val myCar = Car("Toyota", "Corolla", 2020).apply {
    brand = "Honda"
    model = "Civic"
    year = 2022
}
println(myCar)

 

ㅁalso

컨텍스트 객체: `it`으로 참조
반환 값: 컨텍스트 객체
용도: 부가적인 작업(로깅, 유효성 검사 등)을 수행할 때 사용

// also를 사용하여 객체를 수정하는 과정에서 중간 상태를 로깅하거나 디버깅할 수 있다
val numbers = mutableListOf(1, 2, 3)
numbers.also { println("원래 리스트: $it") }
    .add(4)
    .also { println("4를 추가한 후: $numbers") }
    .let { println("리스트의 크기: ${numbers.size}") }

 

ㅁ Scope function 간결한 사용법

ㅇ Scope function을 지나치게 반복하면 가독성이 떨어지고 예측 값을 파악하기 어렵다.

val result = Person.withDefaultName()
    .apply { name = "페트리카" }
    .run { name.length }
    .also { println("이름의 길이는? $it") }
    .let { name -> name + 1 }

 

ㅇ 이런 문제를 해결하기 위해 객체에 적당한 책임을 할당해도 좋다.

val person = Person.withDefaultName()
person.updateName("페트리카")
val result = person.getNameLength() + 1

 

https://hyeon9mak.github.io/using-kotlin-scope-function-correctly/#-%EC%A0%95%EB%A6%AC

ㅇ 이 함수들의 목적은 코드를 더 간결하게 만드는 것이지만, 과도한 사용은 오히려 가독성을 떨어뜨릴 수 있다.

ㅇ 따라서 각 함수의 특성을 이해하고 상황에 맞게 적절히 사용하는 것이 중요하다.

참조: Kotlin Scope function 올바르게 사용하기

 

ㅁ 마무리

Scope Functions는 코드의 가독성을 높이지만, 과도한 사용은 오히려 가독성을 떨어뜨릴 수 있으므로 적절히 사용하는 것이 중요하다.

ㅁ 함께 보면 좋은 사이트

ㅇ 코틀린으로 배우는 함수형 프로그래밍 - 2.10 코틀린 표준 라이브러리 44p

kotlin doc - scope function

Kotlin Scope function 올바르게 사용하기

 

반응형
Comments