Kotlin의 예외 처리
Kotlin의 예외 처리는 Java의 예외처리와 매우 유사하다.
fun function1(str: String): Int {
try {
return str.toInt()
} catch (e: NumberFormatException) {
throw IllegalArgumentException("주어진 ${str}은 숫자가 아닙니다.")
}
}
fun function2(str: String): Int? {
return try {
str.toInt()
} catch (e: NumberFormatException) {
null
}
}
Java는 Unchecked Exception이 있으면 예외 처리를 해야한다는 표시로 빨간 줄이 뜨며
오류를 발생시킨다.
하지만 Kotlin은 그런 오류가 뜨지 않는다.
그 이유는 Kotlin에서는 Checked Exception과 Unchecked Exception을 구분하지 않고
모두 Unchecked Exception으로 처리하기 때문이다.
fun function3() {
val currentFile = File(".")
val file = File(currentFile.absolutePath + "./a.txt")
val reader = BufferedReader(FileReader(file))
println(reader.readLine())
reader.close()
}
Kotlin의 try with resources 구문
Java는 try with resources구문을 사용한다.
try (BufferedReader reader = new BufferedReader(new FileReader(path))) {}
하지만 Kotlin은 try with resources 구문이 존재하지 않고 use 함수를 사용한다.
fun function4(path: String) {
BufferedReader(FileReader(path)).use {reader ->
println(reader.readLine())
}
}
Kotlin에서의 함수
1. Kotlin에서의 함수 선언 문법
Kotlin에서는 함수의 block {} 대신 = 을 사용할 수 있고 = 을 사용하면 return을 제거해야 한다.
= 을 사용하면 반환 타입을 명시적으로 작성하지 않아도 되지만
block {} 을 사용하면 Unit이 아닌 이상 반환타입을 명시적으로 작성해줘야 한다.
fun max1(a: Int, b: Int): Int {
return if(a > b) {
a
} else {
b
}
}
fun max2(a: Int, b: Int) = if(a > B) a else b
2. default parameter
Kotlin에서는 default parameter를 사용할 수 있다.
default parameter란 parameter에 기본값을 설정하는 것
3. named argument (parameter)
Kotiln에서는 함수 호출 시 argument를 명시해줄 수도 있다.
named argument를 사용하면 builder를 직접 만들지 않고 builder의 장점을 가질 수 있다는 장점이 있다.
하지만 Java 함수를 가져다 사용할 때에는 named argument를 사용할 수 없다.
fun repeat1(str: String, num: Int, useNewLine: Boolean) {
for(i in 1..num) {
if(useNewLine) {
println(str)
} else {
print(str)
}
}
}
// 위와 같은 함수는 repeat1("test") 로 동작하지 않음
fun repeat2(str: String, num: Int = 3, useNewLine: Boolean = true) {
for(i in 1..num) {
if(useNewLine) {
println(str)
} else {
print(str)
}
}
}
// 위 함수는 repeat2("test") 로 동작 가능
// named argument
fun main() {
repeat2("Hello World", useNewLine = false)
}
// 위와 같이 사용할 수 있는데 num은 기본값인 3이, useNewLine은 false로 넣을 수 있다.
4. 같은 타입의 여러 parameter 받기 (가변인자)
Java는 가변인자를 받을 때 String... 의 방식으로 사용했지만
Kotlin은 가변인자를 받을 때 vararg를 사용한다.
또한 배열을 가변인자로 받기 위해서는 배열 앞 *를 붙여줘야 한다.
* 는 spread 연산자로 , 로 구분되는 것을 펼쳐주는 연산자이다.
fun printAll(vararg strings: String) {
for(str in strings) {
println(str)
}
}