ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kotlin]범위 지정 함수(apply, run, with, let, also)
    Kotlin 2023. 3. 26. 22:26
    반응형

    [모든 포스팅은 개인적 공부를 위해 작성된 글입니다]

    <범위 지정 함수(Scope Function)란?>

    - 특정 객체에 대한 작업을 블록 안에 넣어 실행할 수 있도록 하는 함수

      - 즉, 블록은 특정 객체에 대한 작업의 범위가 되므로 범위 지정 함수라고 부름

    - 다른 말로 수신객체 지정 람다(함수)라고도 부름

      - 수신객체를 명시하지 않거나 it으로 접근하는 것만으로도 람다 안에서 수신객체의 메서드를 호출할 수 있도록 하기 때문

        - 이것이 가능한 이유는 블록 람다식에서 수신객체를 람다의 입력 파라미터 또는 수신객체로 사용했기 때문

    - 장점 : 코드 간결화, 가독성 증가

     

    <apply>

    - 수신객체 내부 프로퍼티 변경 후 수신객체 자체를 반환받기 위해 사용하는 함수

    - 리턴값 : 수신객체 자체

    - 수신객체 접근 : 블록에서 명시하지 않거나 this를 사용해서 접근 가능

    val member = new Member()
    member.id = "abcd"
    member.name = "efg"

    - 위의 코드를 apply를 사용해서 아래와같이 간단하게 바꿀 수 있음

    val member = Member().apply{
        member.id = "abcd"
        member.name = "efg"
    }

     

    <run>

    - apply와 동일하게 동작하지만 수신 객체 대신 블록의 마지막 줄 리턴

    - 리턴값 : 블록의 마지막 줄

    - 수신객체 접근 : 블록에서 명시하지 않거나 this를 사용해서 접근 가능

    data class Member(
        var id: String,
        var name: String
    ){
        fun nameLength(): Int = name.length
    }
    
    val member = Member(id = "abcd", name = "efg")
    val name_length = member.run{
        name = "hijk"
        nameLength()
    }
    
    println(name_length)//결과값 4

     

    <with>

    - run과 완전히 동일하게 작동하지만 run은 확장 함수로 사용되지만 with는 수신객체를 파라미터로 받아 사용

      - run이 더 깔끔해 with는 잘 사용하지x

    - 리턴값 : 블록의 마지막 줄

    - 수신객체 접근 : 블록에서 명시하지 않거나 this를 사용해서 접근 가능

    val member = Member(id = "abcd", name = "efg")
    val name_length = with(member){
        name = "hijk"
        nameLength()
    }
    
    println(name_length)//4

     

    <let>

    - 수신객체 작업 후 마지막 줄 리턴할 때 사용

    - null check 후 코드를 실행해야하거나 nullable한 수신객체를 다른 타입의 변수로 변환해야 하는 경우 사용(즉, nullable한 값을 다룰 때는 반드시 let 사용)

      - nullable하지 않은 값에 let을 사용해도 되지만 실무에서는 일반적으로 run 사용

      - ? 연산자와 함께 사용해야 함
      - ?.let을 사용하면 수신객체가 null이 아닐 때만 블록 안의 내용 실행됨

    - 리턴값 : 블록의 마지막 줄

    - 수신객체 접근 : 블록에서 it으로 접근 가능(수신객체를 람다의 파라미터로 전달하기 때문)

    val member: Member? = null
    val 변수명 = name?.let { it: Member ->
    }

    <also>

    - apply와 비슷하지만 수신객체에 대한 추가적인 작업(로깅, 유효성 검사, 값 변환)을 한 후 객체를 반환할 때 사용

    - 리턴값 : 수신객체 자체

    - 수신객체 접근 : 블록에서 it으로 접근 가능(수신객체를 람다의 파라미터로 전달하기 때문)

    var num = 3
    
    fun increaseNum() = num.also{
    	num++
    }
    
    println(increaseNum())//3 출력
    println(increaseNum())//4 출력

    - 한번 더 ++되어 4가 되는 것을 원하지 않는 경우 num = num.copy(num = it.num + 1)을 사용해야 함

     

    *참고*

    https://kotlinworld.com/255

     

    [Kotlin] apply, run, with, let, also 차이 한 번에 정리하기

    범위 지정 함수(Scope function)란? 범위 지정 함수는 특정 객체에 대한 작업을 블록 안에 넣어 실행할 수 있도록 하는 함수이다. 블록은 특정 객체에 대해 할 작업의 범위가 되며, 따라서 범위 지정

    kotlinworld.com

     

    반응형

    'Kotlin' 카테고리의 다른 글

    [Kotlin]확장 함수(Extension Functions)  (0) 2023.04.20
    [Kotlin]람다표현식  (0) 2023.03.26
    [Kotlin]데이터 클래스(Data Class)  (0) 2023.03.26

    댓글

Designed by Tistory.