본문 바로가기

공부방/Kotlin

코틀린에서 조건문을(제어문) 다루는 방법

1. if문


[자바]

여기 int가 0보다 작다면 exception을 뱉어내는 메서드가 있습니다.

이런 코드를 코틀린으로 변경하려면 어떻게 해야할까요?

 

private void validateScoreIsnotNegative(int score) {
  	if (score < 0) {
	    throw new IllegalArgumentException(String.format("%s는 0보다 작을 수 없습니다.", score));
  	}
}

 

[코틀린]

디테일한 부분에서는 다른점이 있지만, 크게 달라지는 부분은 없습니다.

다른점이라고 해도 If문에서 달라지는 것은 아니죠.

 

  • 함수에서 Unit (void가 생략됨)
  • 함수 만들때 fun을 사용
  • exception 던질 때 new 가 생략됨

 

fun validateScoreIsNotNegative(score: Int) {
	if (score < 0) {
		throw IllegalArgumentException("${score}는 0보다 작을 수 없습니다.")
	}
}

 

2. if - else문


자바에서 if-else는 Statement이지만 코틀린에서는 Expression 입니다.

Statement와 Expression이 뭘까요?

  • Statement : 프로그램의 문장, 하나의 값으로 도출되지 않는다.
    • 여기에서는 Statement에서 Expression이 제외된 부분을 의미합니다.
  • Expression : 하나의 값으로 도출되는 문장
  • Expression은 Statement에 포함된다.

 

Expression의 예시는 다음과 같습니다.

30 + 40을 했을 때 결과값이 70으로 도출되는 것, 즉 하나의 값으로 도출되는 문장을 말합니다.

Expression의 예시 : 하나의 결과로 도출 되기 때문에 return 받을 수 있습니다.

 

그러나 자바에서는 if문을 Expression으로 취급하지 않기 때문에, if문을 그대로 return 받을 수 없습니다.

return 받기 위해서는 "P"와 "F"앞에 return을 붙여줘야 합니다.

자바에서 Expression으로 취급 받지 못하는 if문

 

이런 문제에 대한 대안으로 자바에서는 3항 연산자를 사용하고 있습니다.

3항 연산자를 사용하게 되면 if문도 Expression으로 취급하기 때문에 바로 변수에 값을 담을 수 있습니다.

 

Expression으로 취급하는 자바의 3항연산자

 

[코틀린]

코틀린에서는 if문을 Expression으로 취급할 수 있습니다.

그렇기 떄문에 아래와 같이 중복되는 return문을 통합할 수 있습니다. 

 

return문 수정 : 변경 전 (좌) -> 변경 후 (우)

 

코틀린에서는 if-else를 Expression으로 사용할 수 있기 때문에 3항 연산자가 없습니다.

 

3. 범위 조건


코틀린에서는 범위를 다음과 같이 확인할 수 있습니다.

변수의 값이 0부터 100 사이가 아닐 경우에 대한 조건문

 

fun validateScore(score: Int) {
	if (score !in 0..100)
		throw IllegalArgumentException("score의 범위는 0부터 100입니다")
}

 

4. when (Java의 switch)


Java의 switch와 if문을 코틀린에서는 when 이라는 문법을 사용하여 문법을 적용할 수 있습니다.

 

[Java]

아래와 같은 자바 문법이 있습니다.

점수에 따라 등급을 매겨주는 코드입니다.

switch case문을 이용하고 있는 것을 확인할 수 있네요.

 

[Kotlin]

코틀린에서는 switch 문을 when 으로 대체 가능합니다.

그리고 case를 사용할 필요가 없으며,

when 문도 Expression이기 때문에 when 앞에 return을 적용할 수 있습니다.

 

fun getGradeWithSwitch(score: Int): String {
	return when (score / 10) {
		9 -> "A"
		8 -> "B"
		7 -> "C"
		else -> "D"
	}
}

 

range에 대한 조건이 있을 경우에는 아래와 같이 적용할 수도 있습니다.

 

fun getGradeWithSwitch2(score: Int): String {
	return when (score) {
		in 90..99 -> "A"
		in 80..89 -> "B"
		else -> "D"
	}
}

 

[Java]

경우에 따라서는 if문을 대체할 수도 있습니다.

obj 변수가 String type이라면 특정 로직을 실행하도록 하여라 라는 문법인데요

이것을 코틀린으로 변경한다면 어떻게 하면 될까요?

 

 

 

[Kotlin]

코틀린에서는 아래와 같이 변경할 수 있습니다.

obj가 String 이라면 obj.startsWith("A") 문법이 실행되고

그렇지 않다면 else 문이 return 되겠네요.

 

fun startsWithA(obj: Any): Boolean {
	return when (obj) {
		is String -> obj.startsWith("A")
		else -> false
	}
}

 

[Java]

조건이 여러개인 경우에도 when문을 사용할 수 있습니다.

아래 코드를 살펴봅시다.

number이 1 또는 0 또는 -1인 경우 "어디서 많이 본 숫자입니다"가 출력되고

그렇지 않은 경우 "-1, 0, 1이 아닙니다"라고 메세지가 출력되는 코드입니다.

 

 

[Kotlin]

코틀린으로는 이렇게 변경할 수 있습니다.

한결 간결해진 것을 확인할 수 있습니다.

 

fun jundgeNumber(number: Int) {
	when (number) {
		1, 0, -1 -> println("어디서 많이 본 숫자입니다")
		else -> println("1, 0, -1이 아닙니다")
	}
}

 

[Java]

when문에는 꼭 변수가 할당 되어야 하는 것은 아닙니다.

아래 코드를 살펴봅시다.

number의 값에 따라서 출력문이 달라지는 코드입니다.

 

 

[Kotlin]

코틀린에서는 아래와 같이 변경할 수 있습니다.

 

fun judgeNumber2(number: Int) {
	when {
		number == 0 -> println("주어진 숫자는 0입니다")
		number %2 == 0 -> println("주어진 숫자는 짝수입니다")
		else -> println("주어진 숫자는 짝수입니다")
	}
}

 

 

* when은 Enum class 혹은 Sealed Class와 함께 사용할 경우, 더욱더 진가를 발휘한다.