Kotlin Contract

๋ฐฐ๊ฒฝ

// ๋ฌธ์ž์—ด์ด ์œ ํšจํ•œ์ง€ (null๋„ ์•„๋‹ˆ๊ณ  ๋น„์–ด์žˆ์ง€๋„ ์•Š์€์ง€) ๊ฒ€์‚ฌํ•˜๋Š” ํ•จ์ˆ˜
fun isValid(value: String?): Boolean {
    return value != null && value.isNotEmpty()
}

fun printVerifiedLength(text: String?) {
    // isValid ํ•จ์ˆ˜๋กœ text๊ฐ€ ์œ ํšจํ•œ์ง€ ๊ฒ€์‚ฌ
    if (isValid(text)) {
        // ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฐœ์ƒ
        // println(text.length)
    }
}
  • ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€๊นŒ์ง€ ์ดํ•ดํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, isValid ๋‚ด๋ถ€์—์„œ value๊ฐ€ null-safeํ•œ์ง€ ๋ชจ๋ฅธ๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— text.length๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.
  • ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Kotlin Contract ํƒ„์ƒํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

How to use

funย isValid(value:ย String?):ย Booleanย {
	contract {  
	    returns(true) implies (value != null)  
	}
	returnย value !=ย nullย && value.isNotEmpty() 
}
  • ๊ฒฐ๊ณผ๊ฐ’์„ true๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด, value๊ฐ€ null์ด ์•„๋‹ˆ๋ผ๋Š” ์ •๋ณด๋ฅผ Compiler์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.

์“ฐ์ž„์ƒˆ

funย runBlock(block: () ->ย Unit)ย {
	// '์ด ๋ธ”๋ก์€ ์—ฌ๊ธฐ์„œ, ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ ์‹คํ–‰๋œ๋‹ค'๊ณ  ๊ณ„์•ฝ
	contract { 
		callsInPlace(block,InvocationKind.EXACTLY_ONCE) 
	} 
	block() 
}
  • ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ณด์ฆ๋„ ๊ณ„์•ฝ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Reference