String 타입은 순서가 정해져 있어 인덱싱(indexing)이 가능합니다. 배열이나 List 컬렉션도 인덱싱이 가능하죠. 인덱싱은 순서가 정해져 있습니다. 인덱싱은 컬렉션 계층 구조에서 최상위 인터페이스인 Iterable 인터페이스와도 관련 있습니다. Iterable 인터페이스에 대해서는 쉽게 다가가는 최신 프로그래밍 언어:코틀린 - 5.3.컬렉션과 5.7 iterator와 sequence를 참고하기 바랍니다.
너무 어렵게 생각할 필요 없습니다. String이건 배열이건 List 컬렉션이건 기능적으로는 같기 때문입니다.
아래 예를 보도록 하죠. String 타입 변수 foo는 Char 타입 원소를 모두 15개 갖고 있습니다. 공백 문자(' ', space)도 원소에 포함됩니다. foo[i]를 인덱싱이라고 부릅니다. 정수 인덱스 i를 사용해 (i+1)번째 원소를 참조합니다. 인덱싱 범위는 0부터 (foo.length-1)까지 입니다.
fun main() {
val foo:String = "My First Kotlin"
val length = foo.length
for (i in 0..(length-1)) {
print(foo[i])
}
println()
}
for 문에서 (시작)..(끝)은 범위 연산자이며, 시작과 끝을 모두 포함하는 폐구간(closed loop)입니다. 아래처럼 범위 타입을 갖는 변수를 만들어 사용할 수 있습니다.
fun main() {
val foo:String = "My First Kotlin"
val length = foo.length
val range:IntRange = 0..(length-1)
for (i in range) {
print(foo[i])
}
println()
}
간단히 until을 사용해도 됩니다. until의 구간은 반 개구간 [0,length)이며, length는 포함하지 않습니다.
fun main() {
val foo:String = "My First Kotlin"
val length = foo.length
for (i in 0 until length) {
print(foo[i])
}
println()
}
위 코드를 훨씬 간단히 작성할 수 있습니다. 위에서처럼 복잡하게 작성할 필요가 없었잖아. 아래 코드가 간단하긴 하지만 인덱싱이란 개념을 알기는 어렵죠. 인덱싱이란 개념을 알고 있는 건 나중에 큰 무기가 됩니다.
fun main() {
val foo:String = "My First Kotlin"
for (ch in foo) {
print(ch)
}
}
아래 예제를 설명하면서 마무리하겠습니다. 인덱싱이 가능한 객체는 Iterable 인터페이스를 상속받으며, iterator() 메소드를 사용해 Iterator<T> 객체로 변환할 수 있습니다. Iterator 객체는 원소를 차례대로 읽어올 수 있는 hasNext()와 next() 메소드를 제공합니다.
fun main() {
val foo:String = "My First Kotlin"
val iter = foo.iterator()
while (iter.hasNext()) {
print("${iter.next()}")
}
println()
}
위 코드는 Iterator 객체를 설명하기 위해 복잡하게 작성했지만, 아래처럼 간단히 작성할 수 있습니다.
fun main() {
val foo:String = "My First Kotlin"
val iter = foo.iterator()
for (element in iter) {
print(element)
}
println()
}
'코틀린' 카테고리의 다른 글
코틀린: 1장 테스트에 도전해 보세요 (0) | 2024.09.08 |
---|---|
코틀린: 널 타입과 안전 호출, 스마트 타입 변환(updated) (0) | 2024.09.04 |
코틀린: String과 CharArray (0) | 2024.09.03 |
코틀린: package와 import(updated) (0) | 2024.09.03 |
코틀린: 진법 변환 구현 (0) | 2024.08.04 |