코틀린 (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
...
}
//1,2,3,4,5
...
}
for (i in 5 downTo 1 step 2) {
//5,3,1
...
}
val list = listOf
for (i in 0 until list.size) {
...
}
for (i in 0 .. (list.size-1)) {
...
}
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}"
}
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}"
}
//구조분해 사용하여 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")
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
코틀린 예외처리
코틀린은 예외처리를 강제하지 않습니다.BufferedReader의 readLine() 에서 throws IOException 를 던지지만 코틀린에서 try 로 감싸지 않아도 됩니다.
fun readLine(reader: BufferedReader) {
reader.readLine() //try 없이 컴파일이 가능하지만, 예외발생시 크래시 발생
}
reader.readLine() //try 없이 컴파일이 가능하지만, 예외발생시 크래시 발생
}
코틀린은 throw 로 예외를 발생시킬 수 있습니다.
그리고 함수 선언 옆에 예외를 명시하지 않습니다.
fun read(...): Int { //예외를 명시할 필요 없음
try {
throw NumberFormatException() //thow
} catch (e: NumberFormatException) { // : 예외타입
return null
} finally {
"finally"
}
}
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"
throw NumberFormatException()
} catch (e: NumberFormatException) {
return //여기서 종료
}
"result = $result"
try 는 블럭으로 감싸져야되며 마지막 식이 결과값이 됩니다.
catch 블럭에서 return 이되면 식이 종료됩니다.
그러나 이후 구문을 실행하고 싶으면 마지막 값을 만들면 이후 구문도 실행이 가능합니다.
val result = try {
throw NumberFormatException()
} catch (e: NumberFormatException) {
null //다음 라인이 이어서 실행
}
"result = $result" //exception 이 발생해도 실행됨 (null 출력됨)
throw NumberFormatException()
} catch (e: NumberFormatException) {
null //다음 라인이 이어서 실행
}
"result = $result" //exception 이 발생해도 실행됨 (null 출력됨)
댓글
댓글 쓰기