본문 바로가기

코틀린

코틀린 Contracts

반응형

코틀린 Contracts 기능은 코틀린 1.3에서 소개된 기능입니다.

컴파일러를 돕는 역할로 실험적인 기능입니다.

 

Initailizing in Lambdas

fun calledOneTimeOnly(run: () -> Unit) {
  // do something
}

fun initValue() {
  val intValue: Int
  calledOneTimeOnly {
    // Does not compile:
    // Captured values initialization is forbidden due to possible reassignment.
      intValue = 1
  }
}

[https://pspdfkit.com/blog/2018/kotlin-contracts/]

위 코드에 보면 function이 한번만 호출되는 것을 컴파일러가 모르기 때문에 intValue가 재할당되지 않는걸 식별할 방법이 없다는 것이다.

 

Contract를 사용하면 아래처럼 쓸 수 있다.

 

@ExperimentalContracts
fun calledOneTimeOnly(run: ()-> Unit) {
    contract {
        callsInPlace(run, InvocationKind.EXACTLY_ONCE)
    }
    run()
}

@ExperimentalContracts
fun initValue() {
    val intValue: Int
    calledOneTimeOnly {
        // Compiles.
        intValue = 1
    }
}

[https://pspdfkit.com/blog/2018/kotlin-contracts/]

종류는 아래와 같습니다.

- UNKNOWN : default

- AT_MOST_ONCE : 0 or 1번 호출

- EXACTLY_ONCE : 1번 호출 보장

- AT_LEAST_ONCE : 1번 이상 호출

 

 

널체크와 캐스팅

fun Any?.isValidString(): Boolean {
    return this != null && this is String && this.length > 0
}

fun getString() : String? {
    // Somehow get the string, which might be null.
}

fun testString() {
    val test = getString()

    if (test.isValidString()) {
        // Does not compile:
        // Type mismatch. Required: String. Found: String?.
        val result: String = test
    }
}

컴파일러가 널체크가 되었는지 알 수 없어서 Type mismatch

 

@ExperimentalContracts
fun Any?.isValidString(): Boolean {
    contract {
        returns(true) implies (this@isValidString is String)
    }
    return this != null && this is String && this.length > 0
}


fun getString() : String? {
    return null
}

@ExperimentalContracts
fun testString() {
    val test = getString()

    if (test.isValidString()) {
        // Compiles.
        val result: String = test
    }
}

returns : 값 반환한다면 컴파일러에게 특정 정보를 전달하는 것

returns(value: Any?): 함수가 특정 값을 반환하는 경우 특정 정보를 컴파일러에게 전달

returnsNotNull: nul을 반환하지 않을 경우에 특정 정보를 컴파일러에게 전달

 

 

 

medium.com/harrythegreat/kotlin-contracts-%EB%AC%B8%EB%B2%95-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EA%B8%B0-9ffdc399aa75

 

[Kotlin] Contracts 문법 쉽게 배워보기

코틀린에선 proposal을 바탕으로 1.3부터 컴파일에게 함수에게 변수의 타입무결성과 함수의 호출횟수를 알려주기위해 도입되었습니다. 사실 코드로 보는게 더 이해가 빠릅니다. 😖

medium.com

pspdfkit.com/blog/2018/kotlin-contracts/

 

What Are Kotlin Contracts and How Are They Useful? | Inside PSPDFKit

An overview of the experimental Kotlin Contracts API.

pspdfkit.com

 

 

반응형

'코틀린' 카테고리의 다른 글

코루틴 컨텍스트 전환  (0) 2021.11.24
코루틴 디버깅  (0) 2021.11.10
코루틴 콘텍스트 (Context)  (0) 2021.01.03
코루틴 상태는 한 방향으로 이동  (0) 2020.12.21
코루틴 1탄  (0) 2020.12.08