[Kotlin]Context Object

Hood·2024년 8월 27일

Kotlin

목록 보기
4/18
post-thumbnail

✍  코틀린과 친해지자

PS문제를 하나씩 풀다보니 공부가 필요한 문법에 대해서 정리한 글입니다.


🔎 컨텍스트 객체 : this or it

스코프 홤수를 정리하다 보니 Context 객체에 대한 thisit 키워드가 나오는데
이번에는 컨텍스트 객체에 대한 설명을 적어보려고 한다.
공식문서에 따르면 Context의 정의는
새롭게 생성된 객체가 지금 무슨 일이 일어나고 있는지 알 수 있도록 하는 객체이다.
이에

범위 함수에 전달된 람다 내부에서 컨텍스트 객체는 실제 이름 대신 짧은 참조로 사용할 수 있다.
각 범위 함수는 컨텍스트 객체를 참조하는 두 가지 방법 중 하나를 사용한다.


this

run, with, apply 컨텍스트 객체를 lambda receiver 로 참조하며 키워드로 this를 사용한다.
대부분의 경우 수신자 객체의 멤버를 접근할 때 생략할 수 있으므로 this를 사용하면 코드가 짧아진다.

class ThisPerson(var name: String, var age: Int?=null)

fun main() {
    val person = ThisPerson("smith", 28)
    person.run { println("이름 : ${this.name}")
    println("나이 : ${this.name}")
    }

    val park = ThisPerson("Park").apply {
        age = 28
    }
    park.run {
        println("이름 : $name")
        println("나이 : $age")
    }
}

위 예를 보면 thisPerson이라는 클래스를 만들어 주고 smith28이라는 나이를 주었다.
그런데 처음에는 run 스코프 함수를 통해서 이름을 출력하고자 하고
그 안에는 이름을 불러올 때 클래스로 다시 불러오는 것이 아닌 this.을 통해 정의하고 있다.
이처럼 this는 클래스에서 자신을 지칭할 때 사용된 것이다.

대부분의 경우, 수신자 객체의 멤버를 접근할 때 생략할 수 있으므로 this 코드가 더 짧아진다.
반면에 this를 생략하면 수신자 멤버와 외부 객체 또는 함수를 구분하기 어려울 수 있다.
따라서 컨텍스트 객체를 수신자(this)로 사용하는 것은

  • 주로 함수를 호출하거나
  • 속성에 값을 할당하여 객체의 멤버에서 작동하는 람다에 권장한다.

it

itlet. 인수 이름이 지정되지 않으면 객체는 암묵적 기본 이름으로 액세스된다.
따라서 this 보다 짧고 표현식은 일반적으로 읽기가 더 쉬워진다.
그러나 객체의 함수나 속성을 호출 할 때 암묵적으로 객체를 사용할 수 없다.
따라서

  • this 객체가 함수 호출에서 인수로 주로 사용되는 경우
  • this 컨텍스트 객체에 엑세스하는 경우 더 좋다.
  • it은 코드 블록에서 여러 변수를 사용하는 경우는 더 좋다.
import kotlin.random.Random

fun writeToLog(message: String) {
    println("INFO: $message")
}

fun main() {
    fun getRandomInt(): Int {
        return Random.nextInt(100).also {
            writeToLog("getRandomInt()에 생성된 값 $it")
        }
    }

    val i = getRandomInt()
    println(i)
}

위 예제 같이 스코프 함수 안 인수를 지정하지 않았는데
암묵적으로 인수 이름이 it이 된 것을 확인 할 수 있다.

import kotlin.random.Random

fun writeToLog(message: String) {
    println("INFO: $message")
}

fun main() {
    fun getRandomInt(): Int {
        return Random.nextInt(100).also { value ->
            writeToLog("getRandomInt()에 생성된 값 $value")
        }
    }

    val i = getRandomInt()
    println(i)
}

또한 인수 이름을 value로 지정한 순간 명확한 이름이 된다.


📌결론

오늘은 Kotlin 스코프 함수 속 Context Object에 대해 알아 보았다.
컨텍스트 객체를 잘 사용하여 코드를 간결하게 만들어 보자!

참고

profile
달을 향해 쏴라, 빗나가도 별이 될 테니 👊

0개의 댓글