티스토리 뷰

조각글

영역함수

빅또리 2021. 11. 5. 17:23

공식문서 : Scope functions

영역함수란?

kotlin 표준 라이브러리가 제공하는 객체의 컨텍스트 안에서 코드 블럭을 실행할 목적으로 만든 함수.

 

 

구분 기준

(1) 객체 참조 방식 (블럭문 안에서)

=> this에 바인딩 (this 키워드 생략가능) vs lambda argument로 전달받기 (implicit default name인 it으로 쓰거나 custom name도 가능)

 

(2) 리턴 값 => 람다식 결과 값 (계산된 값이 없으면 Unit 이든가) vs 객체 (체이닝 가능)

 

+ 확장함수 여부 => with는 다른 함수들처럼 (객체).apply { block } 이렇게 쓰지 않고 with(객체) {block} 이렇게 context 객체를 람다식에 argument로 전달한다.

 

그래서 종류가 2*2+1 = 5 개...

 

 

하나씩 살펴보기

let

=> 객체 참조 : 람다 argument (it)  /  리턴값: 람다 결과 값

 

사용처

- 임시 변수를 사용하는 대신 블럭문 안의 local scope 에서 객체를 it (혹은 다른 argument name)으로 참조하면서 추가 작업 진행

 

- ?. (안전호출 연산자)와 함께 사용해서 null이 아닌 객체 에 대해서만 코드 블럭 안의 내용을 실행하고 싶을때, 그리고 추가로 ?: (엘비스 연산자)와 함께 사용해서 최종 결과값이 null이 아니도록 한다.

fun processNullableString(str: String?) =
    str?.let {
        when {
            it.isEmpty() -> "Empty"
            it.isBlank() -> "Blank"
            else -> it.capitalize()
        }
    } ?: "Null"

 

 

 

also

=> 객체 참조 :  it / 리턴 값 : context object

 

사용처

-  also를 적용한 후 리턴값이 계속 해당 객체인 속성을 활용해서 체이닝으로 부수 효과를 생성하고 싶을 때 사용.

also 코드를 만나면 이렇게 해석하면 좋다 "and also do the following with the object"

val numbers = mutableListOf("one", "two", "three")
numbers
    .also { num -> println("The list elements before adding new one: $num") }
    .add("four")
    
//The list elements before adding new one: [one, two, three]

 

 

 

run

=> 객체 참조 :  this / 리턴 값 : lambda result

 

사용처

- 객체에 대해 configuration 할때. (그리고 리턴 값으로 그 객체가 필요 없을 때)

val service = MultiportService("https://example.kotlinlang.org", 80)

val result = service.run {
    port = 8080
    query(prepareRequest() + " to port $port")
}

- 객체랑 상관없는 Non-extension run으로 쓸수도 있다. 그냥 클로저 같이 쓰는건가...? 

val hexNumberRegex = run {
    val digits = "0-9"
    val hexDigits = "A-Fa-f"
    val sign = "+-"

    Regex("[$sign]?[$digits$hexDigits]+")
}

 

 

 

with

=> 객체 참조 : this / 리턴 값 : lambda result / non-extension function

with 코드는 이렇게 해석될 수 있다 "with this object, do the following"

val numbers = mutableListOf("one", "two", "three")
with(numbers) {
    println("'with' is called with argument $this")
    println("It contains $size elements")
}

 

 

 

apply

=> 객체 참조 : this / 리턴 값 : context object

 

사용처

- 객체 configuration, 그리고 결과값은 그 configuration이 적용된 객체다.

apply 코드를 만나면 이렇게 해석하면 좋다 "apply the following assignments to the object"

val adam = Person("Adam").apply {
    age = 32
    city = "London"        
}
println(adam)

//Person(name=Adam, age=32, city=London)

 

 

여기서 써둔 사용처는 공식 문서에서 소개해 둔 것을 정리한 거고 사실상 그냥 각자 함수 특징 생각해서 필요에 맞게 사용하면 된다.

'조각글' 카테고리의 다른 글

SDKMAN  (0) 2023.10.08
golang 모듈  (0) 2023.04.05
devops 따라하기 시리즈  (0) 2022.03.22
git 빠르게 시작하기 2 (내부 구조)  (0) 2021.02.26
git 빠르게 시작하기  (0) 2021.02.21
댓글
공지사항
최근에 올라온 글