Home Kotlin - 조건문
Post
Cancel

Kotlin - 조건문

  • 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은 더 강력한 기능을 갖는다.
This post is licensed under CC BY 4.0 by the author.