본문 바로가기

Dev Book/Kotlin IN ACTION

CH2(2.4~2.5). Iteration과 예외처리

1. while과 for 루프

- while 루프의 경우 자바와 동일

- for 루프: 코틀린에서는 자바의 for 루프와 대응하는 요소가 없다. 대신 범위를 사용한다. 코틀린의 범위는 양끝을 포함하는 구간이다.

- 수에 대한 iteration

 

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

 

>>> for (i in 1..100) {
	... print(fizzBuzz(i))
    ...}
    
    1 2 Fizz 4 Buzz Fizz 7 8 ...

 

- 증가값을 사용하려면 step을, 끝 값을 포함하지 않으려면 until을 사용한다. downTo를 사용하면 역방향 수열을 만든다. 이 때, step을 붙이면 실제로 -step이 증가값이 된다.

 

- 맵에 대한 iteration

 

val binaryReps = TreeMap<Char, String>()

for(c in 'A'..'F') {
	val binary = Integer.toBinaryString(c.toInt())
    binaryReps[c] = binary
 }
 
 for ((letter, binary) in binaryReps) {
 	println("$letter = $binary")
 }

 

- .. 연산자는 문자 타입의 값에도 적용할 수 있다!

- get과 put 대신 map[key]와 map[key] = value 를 사용해 값을 가져오고 넣을 수 있다.

- 이런 구조 분해 구문을 사용해 컬렉션에서도 원소의 현재 인덱스를 유지하면서 컬렉션을 이터레이션 할 수 있다. (.withIndex() 를 이용하면 인덱스를 저장하기 위한 변수를 별도로 선언 및 증가시킬 필요가 없다.) 

 


2. 코틀린의 예외 처리

- try, catch, finally

- 자바 코드와의 가장 큰 차이는 throws 절이 함수 선언 뒤에 없어도 된다는 것이다. (예를 들어, 자바에서는 함수 선언 뒤에 붙이는 throws IOException은 체크 예외이다.) 자바에서는 체크 예외를 명시적으로 처리해야 한다. 어떤 함수가 던질 가능성이 있는 예외나 그 함수가 호출한 다른 함수에서 발생할 수 있는 예외를 모두 catch로 처리해야하며, 처리하지 않은 예외를 throws 절에 명시해야 한다. 하지만 IOException의 경우 자바가 체크예외 처리를 강제한다고 해서 클라이언트가 취할 수 있는 의미있는 동작은 없으므로 이 예외를 잡아내는 코드는 불필요 하다고 한다.  

- 코틀린은 체크 예외와 언체크 예외를 구별하지 않는다. 

- 코틀린의 try 키워드는 if, when과 마찬가지로 식이다. 따라서 변수에 대입 가능하나 본문을 반드시 { } 로 둘러싸야 한다.