이번 시간에는 Kotlin에서 사용하는 반복문에 대해 정리해보고자 합니다. Kotlin에서는 독특한 반복문이 많아서 알아두면 유용하게 쓸 수 있으니 글을 보고 상황에 맞게 잘 사용하셨으면 좋겠습니다.
먼저 반복문이란 특정한 조건에 만족하면 특정한 코드를 반복적으로 수행하게하는 문장을 뜻합니다. Kotlin에서는 for
문과 while
문, repeat
문이 있습니다.
for문
for
문의 형식은 다음과 같습니다.
for(반복지정자 in List){
반복수행문
}
Kotlin에서 for
문은 다양한 파생이 있는데요. 먼저 Array의 withIndex()
메소드와 함께 사용하여 해당 인덱스와 데이터를 활용하는 방법입니다.
val students = arrayListOf("james", "ben", "mason")
for(name in stduents){
println("${name} ")
}
//james ben mason
for(i in 1..10) {} //1부터 10까지 반복
for(i in 1..10 step 2) {} //1부터 10까지 2간격으로 반복
for(i in 10 downTo 1) {} //10부터 하나씩 내려오며 반복
for(i in 1 until 10) {} //1부터 10미만까지 반복
for((index, name) in students.withIndex()){
println("${index+1}번째 학생: ${name}")
}
/*
1번째 학생: james
2번째 학생: ben
3번째 학생: mason
*/
> forEach문
그리고 for
문 대신 forEach
문을 사용할 수도 있습니다. forEach
문은 Collection 클래스의 요소를 하나하나씩 실행하게 해줍니다.
val students = arrayListOf("james", "ben", "mason")
for(name in stduents){
println("${name} ")
}
//james ben mason
students.forEach { student ->
println(student)
}
/*
1번째 학생: james
2번째 학생: ben
3번째 학생: mason
*/
일반적으로 단순 계산작업의 경우는 for
문의 시간이 훨씬 빠르게 동작합니다. 왜냐하면 forEach
문은 람다 형식으로 함수를 계속 호출하는 형태이기 때문입니다.
하지만 Collection 클래스를 상속받는 List, Set, Map에서 반복문을 수행할 때는 forEach
문이 훨씬 빠른 시간으로 수행할 수 있습니다.
왜 그럴까요?
왜냐하면 Collection 클래스를 상속받는 클래스들은 inline
을 제공하기 때문입니다. inline
이란, 람다식을 사용했을 때 무의미한 객체 생성을 막는 코드를 이야기합니다. 시간을 재보면 이 정도의 차이가 납니다.
fun main(){
val list = (1..10000).toList()
println("ForLoop Time: "+ measureNanoTime {
for(i in list) { loop(i) }
}) // ForLoop Time: 1763600
println("ForEach Time: "+ measureNanoTime {
list.forEach{ i -> loop(i) }
}) // forEach Time: 546600
}
> asSequence()
asSequence()
함수는 List 자료형 호출 시 최적화를 진행할 수 있습니다. 보통 체인 형식으로 Collection 클래스가 호출될 경우( list -> filter -> map 순) List는 값들을 저장하기 위해 temp Collection을 따로 생성하고 값을 저장하게 됩니다.
이럴 경우 성능 상의 문제가 생길 수 있는데 asSequence()
를 통해 lazy Collection을 활용하여 temp Collection을 생성하지 않고 즉시 계산을 수행할 수 있습니다.
list.asSequence()
while문
while
문은 조건에 부합하면 계속해서 반복시켜줍니다. 여느 언어의 while
문과 사용법은 같습니다.
var index = 0
while(index < students.size){
println("${index+1}번째 학생: ${students[index]}")
index++
}
/*
1번째 학생: james
2번째 학생: ben
3번째 학생: mason
*/
repeat문
repeat
문은 지정한 숫자만큼 반복을 하도록 돕는 반복문입니다. 저는 알고리즘 문제를 풀 때 유용하게 쓰고 있습니다.
val count = 5
repeat(count) {
println(Hello World!!)
}
/*
Hello World!!
Hello World!!
Hello World!!
Hello World!!
Hello World!!
*/
forEach(), repeat()에서 break, continue 기능 구현
Java에 없는 반복문인 forEach()
와 repeat()
에서는 break
와 continue
명령어가 존재하지 않습니다. 그럼 어떻게 반복문을 빠져나오거나 스킵할 수 있느냐?!
대신 return
과 '라벨'을 활용할 수 있습니다.
fun main(){
println(measureNanoTime {
// continue 기능
// @forEach는 list.forEach로 돌아가도록 한다.
list.forEach{ i -> if(i>5000) return @forEach
else loop(i) }
})
println(measureNanoTime {
// break 기능
// forEach문에서 @loop를 만나면 run문으로 빠져나온다.
run loop@{
list.forEach { i -> if(i>5000) return @loop
else loop(i)
}
}
})
}
반복문은 언어의 필수문법 중에 하나로 알고리즘이라던지 실제 프로그래밍에서 굉장히 많이 사용합니다. Kotlin에서 사용하는 반복문들을 잘 숙지하시고 Kotlin스러운 프로그래밍을 해나가시길 바랍니다!!
'Android(Kotlin)' 카테고리의 다른 글
[Kotlin Android] View 객체 가져오기(2) - ViewBinding (0) | 2022.08.13 |
---|---|
[Kotlin Android] View 객체 가져오기(1) - findViewById()와 Kotlin Android Extensions (0) | 2022.06.22 |
[Kotlin Android] MotionLayout을 이용한 Twitter Splash 예제 (0) | 2022.06.04 |
[Kotlin Android] 정적 변수와 메소드 :: Companion Object (0) | 2022.05.30 |
[Kotlin Android] Array, ArrayList, List, MutableList (0) | 2022.05.28 |