728x90
반응형
1. 반복자(Iterator)
반복자란? 특정 구간 속에 있는 원소를 하나씩 반복적으로 꺼내기 위한 인터페이스를 뜻한다.
코틀린에는 Iterator라는 인터페이스가 기본적으로 선언되어 있으며, 다음과 같이 생겼다.
interface Iterator<out T> {
operator fun next(): T
operator fun hasNext(): Boolean
}
아래 예제를 통해 next와 hasNext 멤버 함수를 어떻게 사용하는지 살펴보자
fun main() {
val range: IntRange = 1..3
// IntRange 클래스에는 operator fun iterator(): IntIterator 연산자 멤버 함수 선언되어있음
val iter: Iterator<Int> = range.iterator()
// iter는 1..3 구간 중 첫 원소인 1의 바로 이전을 가리키고 있다.
// 여기서 특정 원소를 가리키는 Iterator 내부의 변수를 '커서(Cursor)'라고 부름
println(iter.hasNext()) // 다음 원소가 있으면 true, 없으면 false
println(iter.next()) // 커서를 다음 원소 1로 이동, 1을 반환, 1 출력
println(iter.hasNext())
println(iter.next())
println(iter.hasNext())
println(iter.next())
println(iter.hasNext())
}
2. 반복문 for문
for 문은 다음과 같은 형태로 사용한다.
for(변수 이름: 타입 in 표현식) { ... }
for 문의 소괄호 안에 선언된 변수는 스코프가 for문 안으로 한정되며, in 우측 표현식 속의 데이터를 하나씩 받는데 사용한다.
in 우측의 표현식에는 다음과 같은 연산자 멤버 함수를 갖는 객체만 지정할 수 있다.
operator fun iterator(): Iterator<자유타입>
만약, for(변수 이름: Double in 표현식) 형태로 사용하려 한다면,
표현식이 operator fun iterator(): Iterator<Double> 형태의 연산자 멤버 함수를 갖고 있어야 한다.
즉, for 문 속의 변수 타입과 Iterator의 타입 인수가 같아야 한다.
아래 예제를 통해 for 문을 사용하는 법을 살펴보자
fun main() {
/* IntRange 클래스에는 Iterator<Int> 타입을 반환하는 iterator 연산자 멤버 함수가
선언되어 있으므로 for문의 in 연산자에 적용 가능. Iterator의 타입 인수가 Int 이므로,
Int 타입과 호환되는 타입의 변수만 for 문의 소괄호 속에 선언할 수 있음 */
for(i: Int in 1..10)
println("$i ")
println()
for(i: Int in 1.. 10) {
if(i > 5)
break
print("$i")
}
println()
for(i: Int in 1..5) {
if(i % 2 == 0) {
println("$i 는 짝수입니다.")
}
}
}
728x90
반응형