코틀린 (Kotlin) 루프와 예외처리 정리

코틀린 루프문

코틀린의 루프문에는 while, for 가 있습니다
while은 자바와 비슷하기때문에 패스하기로하고 for문에 대해 알아보겠습니다.

코틀린의 for 문에는 in 이 사용됩니다.

  • i in N..M : N 이상 M 이하 범위 지정
  • i in 0..10 step N : N 만큼 올리거나 내림
  • i in N downTo M: N부터 M까지 역방향으로 내림
  • i in N until M : N부터 M 미만까지


for (i in 1..5) {
 //1,2,3,4,5
 ...
}

for (i in 5 downTo 1 step 2) {
//5,3,1
 ...
}

val list = listOf("1", "2", "3")
for (i in 0 until list.size) { 

 //"1","2","3"
 ...
}

for (i in 0 .. (list.size-1)) { 

 //0,1,2
 ...
}

map과 for 반복문

맵에 대한 루프는 for in 으로 간단하게 구현이 가능합니다.
맵에 put 할때는 map[key] = value 로 자바보다 간단하게 사용할 수 있습니다.
for in 으로 key, value 를 (key, value)처럼 한번에 뽑아낼 수 있습니다.
map 을 key, value로 가져오는것을 구조분해라고 합니다.

val map = TreeMap()
for (m in 'A'..'F') {
    val b = Integer.toBinaryString(m.toInt())
    map[m] = b //map.put(m, b) 과 동일
}

//key value 를 뽑을수 있음
for ((key, value) in map) { //구조분해 사용
     "${key}=${value}"
}

list 와 for 반복문

리스트를 루프할때 값과 인덱스를 동시에 가져올 수 있습니다.
리스트 확장함수인 withIndex() 로 in 으로 구조분해하면 값과 인덱스를 동시에 얻으면서 반복문을 사용할 수 있습니다

val list = listOf<String>("1", "2", "3")

//구조분해 사용하여 index 얻기
for ((index, value) in list.withIndex()) {
 "${index}=${value}"
}

반복문으로 검사하기

in 또는 !in 을 사용할 수 있습니다.
when 에서도 in 을 사용해서 범위를 조건으로 사용할 수 있습니다.
setOf() 로 집합에 포함여부를 체크할 수 있습니다.

//a부터 z까지 검사
fun isLetter(c: Char) = c in 'a'..'z' || c in 'A'..'Z'

//0부터 9인 숫자가 아니면 true
fun isNotDigit(c: Char) = c !in '0'..'9'

//when 에서 in 사용
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…​"
}

//setOf에서 in 사용
"scala" in setOf("java","scala")

코틀린 예외처리

코틀린은 예외처리를 강제하지 않습니다.
BufferedReader의 readLine() 에서 throws IOException 를 던지지만 코틀린에서 try 로 감싸지 않아도 됩니다.

fun readLine(reader: BufferedReader) {
    reader.readLine() //try 없이 컴파일이 가능하지만, 예외발생시 크래시 발생
}

코틀린은 throw 로 예외를 발생시킬 수 있습니다.
그리고 함수 선언 옆에 예외를 명시하지 않습니다.

fun read(...): Int { //예외를 명시할 필요 없음
    try {
        throw NumberFormatException()   //thow
    } catch (e: NumberFormatException) { // : 예외타입
        return null
    } finally {
        "finally"
    }
}

코틀린의 예외는 이 될 수 있습니다.
아래 코드처럼 try 식을 result 변수에 할당할 수 있습니다.
throw 가 발생하는 경우 catch 의 return null 이되어 result 에는 null 이 할당됩니다.

val result = try {
    throw NumberFormatException()
} catch (e: NumberFormatException) {
    return //여기서 종료
}
"result = $result"

try 는 블럭으로 감싸져야되며 마지막 식이 결과값이 됩니다.

catch 블럭에서 return 이되면 식이 종료됩니다.
그러나 이후 구문을 실행하고 싶으면 마지막 값을 만들면 이후 구문도 실행이 가능합니다.

val result = try {
   throw NumberFormatException()
} catch (e: NumberFormatException) {
    null //다음 라인이 이어서 실행
}
"result = $result" //exception 이 발생해도 실행됨 (null 출력됨)


댓글

이 블로그의 인기 게시물

코틀린 (Kotlin) filter, map, all, any, count, find, groupBy, flatMap 함수 정리

코틀린 (Kotlin) 인터페이스 정리

RecyclerView 에서 notifyItemChanged()의 payload 이해하기