반복

tkppp·2021년 12월 19일
0

Kotlin

목록 보기
1/11

코틀린의 반복

while 문의 경우 자바와 동일하지만 for문은 for-each 형식의 반복문만 제공한다. 반복문을 사용하는 방법을 알아보자.

Range 클래스

코틀린은 특정 법위의 값을 반복하기 위해서 특화된 클래스들로 추상수준을 올렸다. Range 클래스로 범위를 만들기 위해서는 ..를 사용한다.

// 늘 그렇듯이 타입은 생략할 수 있다.
val oneToFive: IntRange = 1..5
val aToE: CharRange = 'a'..'e'
val seekHelp: ClosedRange = "hell".."help"

// contains() 메소드를 이용해 범위 내에 포함되는지 쉽게 알 수 있다.
oneToFive.contains(1)		// true
seekHelp.contains("Hell")	// false

정방향 반복

범위를 통해 for문으로 반복을 수행할 수 있다. 유의할 점은 양 끝의 값을 포함하는 닫힌 구간이라는 것이다.

for(i in 1..5) { print("$i, ") }

ClosedRange<T> 클래스의 범위 객체는 for 반복을 수행할 수 없다. 클래스 내부에 이터레이터가 정의되어 있지 않기 떄문이다. 추후 이 클래스들을 순회하는 방법을 알아보자.

후방향 반복

downTo() 메소드를 사용해 후행 반복을 수행할 수 있다. downTo() 메소드를 사용하면 Progression 인스턴스가 생성되어 반복을 수행한다. 중위 표기법을 이용하여 깔끔하게 표기할 수도 있다.

for(i in 'c'.downTo('a'))	// 메소드 사용
or
for(i in 'c' downTo 'a')	// 중위 표기법

반열린구간 반복

일반적으로 순회할때 마지막 인덱스 전까지 반복한다. 이런 경우에는 until을 사용하면 된다.

for(i in 0 until 5)	// 0부터 4까지 반복. 마지막 포함 X

범위 안의 값 건너뛰기

i = i + 3 같이 중간 중간 건너 뛰어 순회하고 싶은 경우가 있을 것이다. 이런 경우에는 step을 사용한다. step이 없는 경우에는 기본적으로 1로 설정되어 있는것이다.

for(i in 1..10 step 3)	// 1, 4, 7, 10 출력

특정 값만 순회하기

3의 배수 또는 5의 배수의 수만 배열하고 싶은 경우가 있을 수 있다. 이런 경우에는 Progression 객체의 filter() 메소드를 사용한다. filter 메소드는 매개변수로 람다식을 사용한다.

for(i in (1..10).filter { it % 3 == 0 || it % 5 == 0}

배열과 리스트의 반복

일반적으로 순회가 가장 많이 사용되는 것은 배열 또는 리스트같은 자료구조다. 코틀린은 JDK의 배열과 컬렉션을 그대로 사용하므로 사용법은 동일하다. 단 코틀린만의 확장 함수로 더 쉽게 간편하게 배열과 컬렉션을 사용할 수 있다.

배열, 리스트의 생성

자바에서는 new 연산자를 통해 배열과 리스트를 생성했지만 코틀린에서는 kotlin 패키지에 포함된 [type]Of() 메소드를 이용한다.

val arr = arrayOf(1,2,3)	// 정수 객체 배열 생성
val intArr = intArrayOf(1,2,4)	// 원시 타입 배열 생성

각 타입에 맞는 메소드를 호출해 배열과 리스트를 생성할 수 있다.

배열, 리스트의 반복

타 언어와 자바의 for-each 구문과 같이 반복할 수 있다.

for(e in array) { print("$e, ") }

인덱스로 반복하기

indices 프로퍼티를 이용해 인덱스로 반복할 수 있다.

val nameList = listOf("ABC", "AAA", "CCC")
for(index in nameList.indices) { print(nameList[index] or nameList.get(index)) }

인덱스와 위치를 같이 얻기

withIndex() 함수를 이용해 인덱스와 위치를 구조분해 할당하여 사용할 수 있다.

val nameList = listOf("ABC", "AAA", "CCC")
for((index, name) in nameList.withIndex()) { print("index : $index, name : $name") }

when

when은 코틀린에서 switch 문을 대체하는 요소로 표현식이 될 수도, 명령문이 될 수 도 있다. switch문과 다르게 break로 구분하지 않고 : 대신 -> 로 본문을 작성한다.

fun whatToDo(dayOfWeek: Any) = when(dayOfWeek){
        "Saterday", "Sunday" -> "Relax"
        in listOf("Monday", "Tuesday", "Wednesday", "Thursday") -> "Work hard"
        in 2..4 -> "Work hard"
        "Friday" -> "Party"
        is String -> "What?"
        else -> "No Clue"
    }

표현식 when

본문의 내용이 표현식이고 else 구문이 존재하면 when을 표현식으로 사용할 수 있다. 블록을 본문으로 사용할 경우 블록의 마지막 줄이 표현식이 된다.

명령문 when

본문의 내용이 표현식이 아닐 경우에는 else가 강제되지 않는다.

when의 변수

when의 파라미터는 외부에서 전달된 값만 사용하는 것은 아니다 직접 값을 정의할 수 있다.

fun systemInfo(): String = when(val numberOfCores = Runtime.getRuntime().availableProcessors()){
    1 -> "1 core"
    in 2..16 -> "$numberOfCores core"
    else -> "Good!"
}

0개의 댓글