[Kotlin in Action] 5. while과 for 루프, Map 이터레이션, in으로 원소검사

반응형
728x90
반응형

while, do~while

Kotlin에서 while, do~while문 사용은 Java와 동일하다.

새로 추가된 기능도 없다.

 

 

for루프

  • 코틀린에는 자바의 for에 해당하는 요소가 없다.
  • 이런 루프의 가장 흔한 용례인 초기값, 증가값, 최종값을 사용한 루프를 대신하기 위해 코틀린에서는 범위(range)를 사용한다.
  • 범위는 기본저긍로 두 값으로 이뤄진 구간이다.
  • 보통은 그 두 값은 정수 등의 숫자 타입의 값이며, .. 연산자로 시작 값과 끝 값을 연결해서 범위를 만든다.
// 양 끝을 포함하는 구간 : 10까지 포함
val oneToTen = 1..10

어떤 범위에 속한 값을 일정한 순서로 이터레이션하는 경우를 수열(progression)이라고 부른다.

 

 

예제

fun fizzBuzz(i: Int) = when {
    i % 15 == 0 -> "FizzBuzz"
    i % 3 == 0 -> "Fizz"
    i % 5 == 0 -> "Buzz"
    else -> "$i"
}

 

  • 범위 : 1 <= i <= 100
fun main() {
    for (i in 1..100) {
        println(fizzBuzz(i))
    }
}

 

  • 범위 : 1 <= i < 100 (100을 포함하지 않는다.)
fun main() {
    // 1 ~ 99
    // 마지막 100을 포함하지 않기 위한
    for (i in 1 until 100) { // = for (i in 1 .. 100-1)
        println(fizzBuzz(i))
    }
}

 

  • 범위 : 100 >= i >= 1 (증가값: -2)
fun main() {
    // 100 downTo 1 : 역방향 수열을 만든다.. (기본 증가 값이 -1)
    // step 2 를 붙이면, 증가 값의 절댓값이 2로 바뀐다. (증가 값의 방향은 바뀌지 않고, 증가값은 실제로 -2)
    for (i in 100 downTo 1 step 2) {
        println(fizzBuzz(i))
    }
}
Buzz
98
Fizz
94
92
FizzBuzz
. . .
8
Fizz
4
2

 

 

Map 이터레이션

fun main() {
    // key 에 대한 정렬을 위해 treeMap 사용
    val binaryReps = TreeMap<Char, String>()

    for(c in 'A'..'F') { // A 부터 F까지
        val binary = Integer.toBinaryString(c.toInt()) // 아스키코드 -> 2진표현으로 바꾼다.
        binaryReps[c] = binary // key : c, value : 2진표현
//        binaryReps.put(c, binary) // 위 코드와 동일
    }
}
  • key : c, value : 2진표현 binary 변수
// 동일한 코드
binaryReps[c] = binary 
binaryReps.put(c, binary)

 

  • Map 이터레이션 수행
// Map에 대해 이터레이션한다.
// Map의 Key와 value를 두 변수에 각각 대입한다.
for ((letter, binary) in binaryReps) {
    println("$letter = $binary")
}

 

  • list 에서 index와 함께 컬렉션을 이터레이션하기
val list = arrayListOf("10", "11", "1001")

// 인덱스와 함께 컬렉션을 이터레이션한다.
for ((index, element) in list.withIndex()) {
    println("$index: $element")
}

 

 

in으로 원소검사

  • 글자인지 체크
// 글자인지 체크
//  c in 'a'..'z' -> 'a' <= c && c <= 'z'
fun isLetter(c: Char) = c in 'a'..'z' || c in 'A'..'Z'

 

  • 숫자가 아닌지 체크
// 숫자가 아닌지 체크
fun isNotDigit(c: Char) = c !in '0'..'9'

 

  • when절 사용
fun recognize(c: Char) = when (c) {
    in '0'..'9' -> "It's a digit!" // c 값이 0부터 9 사이에 있는지 검사한다.
    in 'a'..'z', in 'A'..'Z' -> "It's a letter!"
    else -> "I don't know..."
}

 

  • main 함수 수행
fun main() {
    println(isLetter('q'))
    println(isNotDigit('x'))
    println(recognize('8'))

    // "Java" <= "Kotlin" && "Kotlin" <= "Scala"
    println("Kotlin" in "Java".."Scala")
}

 

 

반응형

Designed by JB FACTORY