.. 연산에 의해 만들어지는 범위는 닫혀 있다(closed). 즉, 시작 값과 끝 값이 범위에 포함된다. 끝 값이 제외된, 반만 닫힌 범위(semi-closed range)를 만드는 다른 연산도 있다. 이 연산은 정수 타입에 대해서만 사용할 수 있고 끝 값보다 1 작은 값까지 들어있는 범위를 만들어낸다. 다음 예제에서 상계(upper bound)인 100은 범위에 포함되지 않는다.
val twoDigits = 10 until 100 // 10..99와 같음. 100은 포함되지 않음
내장 범위 연산에서 끝 값이 시작 값보다 확실히 더 작으면 빈 범위가 된다.
println(5 in 5..5) // true println(5 in 5 until 5) // false println(5 in 10..1) // false
일반적으로 주어진 타입에 대한 비교 연산이 제대로 작동하지 않는 경우 이런 특징이 성립하지 않는다. 특히 비교 연산이 추이적(transitive)4이지 않으면 a > b임에도 불구하고 x in a..b가 참이 될 수 있다.
범위와 연관이 있는 개념으로 진행(progression)이 있다. 진행은 정해진 간격(step)만큼 떨어져 있는 정수나 Char 값들로 이뤄진 시퀀스를 말한다. 정수나 Char에 대해 정의된 범위는 실제로는 간격이 1인 진행이라 할 수 있다. 하지만 일반적으로 진행이 범위보다 더 많은 옵션을 제공한다. 예를 들어 다음 코드처럼 downTo 연산을 사용하면 아래로 내려가는(descending) 진행을 만들 수 있다.
println(5 in 10 downTo 1) // true println(5 in 1 downTo 10) // false: 빈 진행임