확실하게 어떤 형태로 동작해야 하는 코드가 있다면 예외를 활용해 제한을 걸어주는 것이 좋은데 코틀린에서는 코드의 동작에 제한을 걸 때 다음과 같은 방법을 사용할 수 있음
require 블록 : 아규먼트 제한
check 블록 : 상태와 관련된 동작 제한
assert 블록 : 어떤 것이 true인지 확인 가능 그러나 테스트 모드에서만 동작
return 도는 throw와 함께 활용하는 Elvis 연산자
EX )
classStack<T>(var collection: List<T>) {privateval size =3privateval isOpen =falsefunpop(num: Int=1): List<T> {require(num <= size) {"Cannot remove more elements than current size" }check(isOpen) { "Cannot pop from closed stack" }val ret = collection.take(num) collection = collection.drop(num)assert(ret.size == num)return ret }}
위 코드의 장점
제한을 걸면 문서를 읽지 않은 개발자도 문제 확인 가능
문제가 있을 경우에 함수가 예상하지 못한 동작을 하지 않고 throw함
예상하지 못한 동작을 하는 것보단 throw 하는 것이 훨씬 안정적이고 관리하기 좋음
코드가 어느 정도 자체적으로 검사가 됨
스마트 캐스트 기능을 활용할 수 있게 되므로, 캐스트를 적게할 수 있음
제한을 훨씬 더 쉽게 확인할 수 있음
애플리케이션을 더 안정적으로 지킬 수 있음
코드를 잘못 쓰는 상황을 막을 수 있음
스마트 캐스팅 활용할 수 있음
코틀린에서 제공하는 제한 매커니즘
require 블록 : 아규먼트와 관련된 에측을 정의할 때 사용하는 범용적인 방법
check 블록 : 상태와 관련된 에측을 정의할 때 사용하는 범용적인 방법
assert 블록 : 테스트 모드에서 테스트할 때 사용하는 범용적인 방법
return과 throw 와 함께 Elvis 연산자 사용