- if문
- Expression, Statement
- switch, when
조건문
if문
1
2
3
4
fun validateScoreIsNotNegative(score: Int) {
if (score < 0) {
throw IllegalArgumentException("${score}는 0보다 작을 수 없다.")
}
조건문만 보면 자바와 차이가 없고, throw를 할 때에도 new를 사용하지 않는다는 점, 함수 선언 시 fun을 사용한다는 점에만 차이가 있다.
Expression & Statement
else가 포함된 if문을 코틀린으로 작성해보자.
1
2
3
4
5
6
7
fun getPassOrFail(score: Int): String {
if (score >= 50) {
return "P"
} else {
return "F"
}
}
자바와 동일해보인다. 하지만 아래와 같은 한 가지 차이가 있다.
- Java
- if-else = Statement
- Kotlin
- if-else = Expression
Expression & Statement
- Expression: 하나의 값으로 도출되는 문장
- Statement: 프로그램의 문장, 하나의 값으로 도출되지 않는다.
1
2
3
4
5
String grade = if (score >= 50) {
"P";
} else {
"F";
}
위 자바 코드를 보자. if문을 하나의 값으로 취급하지 않기때문에 grade에 당연히 대입할 수 없다.
자바에서 이런 경우를 위해 삼항연산자가 존재한다.
1
String grade = score >= 50 ? "P" : "F";
위와 같은 삼항연산자 코드는 하나의 값으로 떨어지는 Expression이면서 Statement이다.
그렇다면 코틀린에서 if-else문이 expression이라는 점을 통해 어떻게 표현할 수 있는지 보자.
Kotlin if-else = expression
1
2
3
4
5
6
7
fun getPassOrFail(score: Int): String {
return if (score >= 50) {
"P"
} else {
"F"
}
}
마치 자바에서 삼항연산자를 이용해 바로 값을 계산하여 return하는 것 처럼 if-else를 바로 계산해 return할 수 있게 되는 것이다.
따라서 삼항연산자가 필요없기 때문에 코틀린에는 삼항 연산자가 존재하지 않는다.
팁
1
if (0 <= score && score <= 100)
자바에서는 점수가 0이상, 100이하인 경우를 필터링할 때 위와 같이 조건문을 걸었었다.
물론 같은 방식을 코틀린에서도 사용할 수 있지만 코틀린에서는 어떻게 다르게 표현할 수 있을까?
1
if (score in 1..100)
위와 같이 간단히 표현할 수 있다. 1~100범위 밖이라면 !in을 사용해주면 된다.
Switch, when
1
2
3
4
5
6
7
8
fun getGradeWithSwitch(score: Int): String {
return when (score / 10) {
9 -> "A"
8 -> "B"
7 -> "C"
else -> "D"
}
}
- switch 대신 when을 사용한다.
- case 대신 -> 을 사용한다.
- default 대신 else를 사용한다.
- Expression이므로 바로 return할 수 있다.
이렇게 문법적인 부분 이외에도 코틀린의 when은 더 다양한 활용이 가능하다. 코드를 보자.
1
2
3
4
5
6
7
8
fun getGradeWithSwitch(score: Int): String {
return when (score) {
in 90..99 -> "A"
in 80..89 -> "B"
in 70..79 -> "C"
else -> "D"
}
}
1
2
3
4
5
6
fun judgeNumber(number: Int) {
when (number) {
1, 0, -1 -> println("1, 0, -1 입니다.")
else -> println("not 1, 0, -1")
}
}
1
2
3
4
5
6
7
fun judgeNumber2(number: Int) {
when {
number == 0 -> println("주어진 숫자는 0입니다.")
number % 2 == 0 -> println("주어진 숫자는 짝수입니다.")
else -> println("주어지는 숫자는 홀수 입니다.")
}
}
- 다양한 조건을 가지고 분기를 칠 수 있다.
- in 90..99와 같은 조건부에는 어떠한 expression이라도 들어갈 수 있다.
- is, in 등등
- 여러개의 조건을 한 번에 검사할 수 있다.
- when에 값이 없을 수 있다.
- when 옆 ()가 없다.
- 자바에서 위와 같은 효과를 내려면 if문을 여러번 걸어 print해주고 else를 위해 early return 해주어야 할 것이다.
정리
- if / if-else 등 모두 자바와 문법은 동일하다.
- 단 코틀린에서는 Expression으로 취급해 바로 return할 수 있다.
- 따라서 삼항연산자가 없다.
- 자바의 switch는 코틀린에서 when으로 대체되었으며 when은 더 강력한 기능을 갖는다.