범위(Range) 및 진행(Progression) — 코틀린에서 특정 단계로 값의 순서를 나타내기 위한 내장 메커니즘입니다. 이들은 주로 루프, 조건, 컬렉션 반복 및 데이터 검증과 작업할 때 사용됩니다. Range는 코틀린의 문법을 자바보다 간결하고 표현력 있게 만들기 위한 방법 중 하나로 등장했습니다.
자바에서는 유사한 작업이 인덱스가 있는 for 및 while 루프를 통해 수행되어 다소 장황하고 오류에 취약했습니다. 코틀린에서는 범위를 생성하기 위한 간결한 연산자(예: 1..10)와 단계 설정을 위한 메서드가 도입되었습니다.
코틀린은 표준 숫자 범위(IntRange, LongRange, CharRange, UIntRange 등)와 사용자 정의 진행을 생성하기 위한 인터페이스를 제공합니다:
코드 예:
for (i in 1..5) print("$i ") // 1 2 3 4 5 for (i in 5 downTo 1 step 2) print("$i ") // 5 3 1 // 값 확인 val x = 42 if (x in 1..100) println("범위 내에 있습니다!")
사용자 정의 타입에 대해 범위를 정의하려면 rangeTo 및 Progression 연산자를 구현해야 합니다:
data class Version(val major: Int, val minor: Int) : Comparable<Version> { override fun compareTo(other: Version) = compareValuesBy(this, other, Version::major, Version::minor) } operator fun Version.rangeTo(other: Version) = VersionRange(this, other) class VersionRange( override val start: Version, override val endInclusive: Version ) : ClosedRange<Version> for (v in Version(1, 0)..Version(1, 2)) println(v)
주요 특징:
start..end, downTo, step).in, !in).1..5 표현식이 실제로 반환하는 것은 무엇인가요?
이것은 ClosedRange<Int> 인터페이스를 구현하는 IntRange 클래스의 인스턴스를 생성합니다. 이것은 컬렉션이 아니라 경계와 단계를 정의하는 객체입니다. 지연(yield) 구현입니다.
왜 범위의 단계(step)는 항상 1인가요? 단계는 어떻게 변경하나요?
기본적으로 범위의 step은 1입니다(또는 downTo의 경우 -1). 다른 단계는 step 및 downTo 메서드를 사용하여 설정합니다. 예를 들어:
for (i in 2..10 step 2) println(i)
비교 가능한 것을 구현하지 않은 타입과 범위를 사용할 수 있나요?
아니요, 사용자 정의 범위가 올바르게 작동하려면 형식이 Comparable 인터페이스를 구현해야 하며, 그렇지 않으면 rangeTo 연산자가 작동할 수 없습니다.
step 메서드를 사용하지 않고 Range의 단계를 변경하려는 시도.개발자가 downTo 없이 for (i in 5..1) 루프를 사용하여 "5, 4, 3, 2, 1"이 될 것이라고 기대하지만 실제로는 루프가 한 번도 실행되지 않습니다.
장점:
단점:
원하는 간격으로 보고서를 반복하기 위해 downTo 및 step을 사용하는 진행을 활용하여 코드를 간결하고 문서화할 수 있습니다.
장점:
단점: