KotlinInAction/코틀린 기초

While과 for 루프

webmaster 2022. 7. 26. 13:01
728x90

while 같은 경우 JAVA와 동일하고, for 같은 경우 for 아이템 in 원소들 형태를 취한다.

while

while(조건){
	//문장
}

do {
	//문장
} while(조건)

수에 대한 이터레이션 : 범위와 수열

코틀린에서는 초깃값, 증가값, 최종 값 루프가 없기 때문에 범위를 사용한다.

범위는 기본적으로 두 값으로 이뤄진 구간이며,  보통 그 두 값은 정수 등의 숫자 타입의 값이며 (..) 연산자로 시작 값과 끝 값을 연결해서 범위를 만든다

val oneToTen = 1..10
  • 코틀린에서 범위는 폐구간 또는 양끝을 포함하는 구간이다
    • 위 예에서 항상 10은 포함이 되있다는 의미
  • 어떤 범위에 속한 값을 일정한 순서로 이터레이션 하는 경우를 수열이라고 한다.
fun fizzBuzz(i: Int) = when {
    i % 15 == 0 -> "FizzBuzz " //i 가 15로 나누어 떨어지면 FizzBuzz 반환
    i % 3 == 0 -> "Fizz "//i 가 3로 나누어 떨어지면 Fizz 반환
    i % 5 == 0 -> "Buzz "//i 가 5로 나누어 떨어지면 Buzz 반환
    else -> "$i "
}
fun main(args: Array<String>) {
    for(i in 1..100){
        print(fizzBuzz(i))
    }
}

100 ~ 1 까지 거꾸로 세고, 짝수만 실행

fun main(args: Array<String>) {
    for(i in 100 downTo 1 step 2){
        print(fizzBuzz(i))
    }
}
  • 증가 값 step을 갖는 수열에 대해 이터레이션 한다.
    • 증가 값을 이용해 수를 건너뛸 수 있다.
    • 증가 값을 음수로 만들면 정방향 수열이 아닌 역방향 수열을 만들 수 있다.
  • 100 downTo 1로 역방향 수열을 만든다
  • ..(연산자)는 항상 끝 값을 포함하게 되는 데 포함하지 않는 경우에 대해서는 until 함수를 사용하자
    • x in 0 until size 라는 루프는 for(x in 0..size-1)과 같지만 좀 더 명확하게 개념을 표현한다.

맵에 대한 이터레이션

val binaryReps = TreeMap<Char, String>()
fun iterator(){
    for(c in 'A' .. 'F'){
        val binary = Integer.toBinaryString(c.toInt())
        binaryReps[c] = binary
    }
    for((letter, binary) in binaryReps){
        println("$letter = $binary")
    }
}
fun listIterator(){
    val list = arrayListOf("10", "11", "1001")
    for((index, element) in list.withIndex()){
        println("$index: $element")
    }
}
  • .. 연산자는 숫자 타입의 값 뿐만 아니라 문자 타입의 값에도 적용할 수 있다.
  • letter, binary라는 두 변수에 저장한다.
  • get, put을 사용하는 대신에 map[key]map [key] 또는 map [key] = value를 사용해 값을 가져오고 설정할 수 있다.
  • 맵에 사용했던 구조 분해 구문을 맵이 아닌 컬렉션에도 활용할 수 있다
    • 원소의 현재 인덱스를 유지하면서 컬렉션을 이터레이션이 가능하다.
    • 인덱스를 저장하기 위한 변수를 별도로 선언하고 루프에서 매번 그 변수를 증가시킬 필요가 없다.

in으로 컬렉션이나 범위의 원소 검사

in 연산자를 사용해 어떤 값이 범위에 속하는지 검사할 수 있다. 반대로 !in을 사용하면 어떤 값이 범위에 속하지 않는지 검사할 수 있다.

fun isLetter(c: Char) = c in 'a'..'z' || c in 'A'..'Z'
fun isNotDigit(c: Char) = c !in '0'..'9'
fun main(args: Array<String>) {
	println(isLetter('q'))
    println(isNotDigit('X'))
}

when 식으로 변경

fun recognize(c: Char) = when(c){
    in '0'..'9' -> "It's a digit"
    in 'a'..'z', in 'A'..'Z' -> "It's a letter"
    else -> "I don't know..."
}
  • 비교가 가능한 클래스(Comparable을 구현) 라면 클래스의 인스턴스 객체를 사용해 범위를 만들 수 있다.
  • Comparable을 사용하는 범위의 경우 그 범위 내의 모든 객체를 항상 이터레이션 할 수 없다
    • 예를 들어 Java , Kotlin 일 경우 둘 사이의 모든 객체를 이터레이션 할 수 없다
    • 하지만 in 절을 사용하면 값이 해당 범위 안에 속하는 지 항상 결정할 수 있다
      • "kotlin" in "Java".."Scala" // "Java" <= "Kotlin" && "Kotlin" <= "Scala"
    • 컬렉션에도 마찬가지로 적용 가능
      • "kotlin" in setOf("Java", "Scala")

 

728x90

'KotlinInAction > 코틀린 기초' 카테고리의 다른 글

코틀린의 예외 처리  (0) 2022.07.26
enum과 when  (0) 2022.07.25
클래스와 프로퍼티  (0) 2022.07.25
함수와 변수  (0) 2022.07.25