- 코틀린은 외부 반복자와 내부 반복자 모두 제공한다.
- 이장은 외부 반복의 효율성에 집중한다.
- 이번 파트는 범위를 가지는 값들과 콜렉션 객체들을 간결하고 우아하게 반복하는 기능을 배운다.
범위와 반복
레인지 클래스
//ranges.kt
fun main() {
val oneToFive: IntRange = 1..5
val aToE: CharRange = 'a'..'e'
val seekHelp: ClosedRange<String> = "hell".."help"
//number repeat
oneToFive.forEach { print(it) }
//string repeat
aToE.forEach { print(it) }
// seekHelp.forEach { println(it) } // Wrong Syntax!
println(seekHelp.contains("helm"))
println(seekHelp.contains("helq"))
}
- kotlin.ranges 패키지는 Int, Long, Char같은 원시타입에 국한되지 않고 지원한다.
- String값도 가능하다. 위 예제에서 helm은 hell과 help 사이에 있는 문자이기 때문에 true를 반환 하고 helq는 범위 밖이므로
false
를 반환하게 된다.
정방향 반복
//ranges.kt
fun main() {
//...
for(i in 1..5) {print("$i, ")}
for(ch in 'a'..'e'){print(ch)}
for(word in 'hell'..'help'){print("$word, ")} // for-loop range must hanve an 'iterator()' method
}
- 범위를 만들었기 때문에 for(x in ..) 문법일 이용해 반복을 수행할 수 있다.
- 명시적으로 선언하지 않았어도 변수 i는
val
이다. 즉, 우리는 반복문 안에서 i를 변경시킬 수 없다.
- "hell" 부터 "help"까지 반복을 시도하면 for-loop range must hanve an 'iterator()' method 라는 에러가 발생한다. → 실제는 error: too many characters in a character literal ''hell''가 발생
- 이유는 IntRange나 CharRange같은 클래스들은 iterator() 함수를 갖고 있지만, 문자열의 반복은 iterator() 함수를 가지고 있지 않다.
- 하지만 방법이 없는건 아니다 12장에서 객체를 반복하는 확장 함수에 대해 알아볼 것임.
후방향 반복