[코틀린] 코틀린에서 제어문을 다루는 법

J·2023년 3월 20일
1

안드로이드

목록 보기
16/29

if문

a. 자바 코드

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

b. 코틀린 코드

fun validateScoreIsNotNegative(score: Int) {
  if(score < 0) {
    throw IllegalArgumentException("${score}는 0보다 작을 수 없습니다.") //new를 사용하지 않고 예외를 throw 하는 것 외엔 자바와 다를 게 없음.
  }
}

c. 문법

if (조건) {

}

자바 코드 2

private String getPassOrFail(int score) {
  if(score >= 50) {
    return "P";
  } else {
    return "F";
  }
}

코틀린 코드 2

fun getPassOrFail(score: Int): String{
  if (score >= 50) {
    return "P"
  } else {
    return "F"
  }
}

2. Expression & Statement

Java에서 if-else는 Statement 이지만, Kotlin에서는 Expression 입니다.

  • Statement : 프로그램의 문장, 하나의 값으로 도출되지 않는다.
  • Expression : 하나의 값으로 도출되는 문장.
int score = 30 + 40;

30 + 40 은 70이라는 하나의 결과가 나온다. Expression 이면서 Statement라고 할 수 있다.

자바에서는 if문을 하나의 값으로 취급하지 않는다.
따라서 다음과 같은 코드에서는 에러가 날 수 밖에 없다.

String grade = if (score >= 50) { // 여기서부터 문법 오류가 남.
  "P";
} else {
  "F";
}

따라서, 이 문장은 '='을 통해서 바로 값을 대입할 수 없으므로 Statement라고 할 수 있다.

String grade = score >= 50 ? "P" : "F"

=> 3항 연산자는 하나의 값으로 취급하므로 에러가 없다. Expression 이면서 Statement 이다.

코틀린에서는 if~else 구문을 다음과 같이 사용 가능하다.

fun getPassOrFail(socre: Int): String {
  if (score >= 50) {
    return "P"
  } else {
    return "F"
  }
}

또는

fun getPassOrFail(score: Int): String {
  return if (score >= 50) {
    "P"
  } else {
    "F"
  }
}

=> 두번째 경우처럼 사용 가능한 이유는 코틀린은 Expression 이기 때문.
자바의 3항 연산자를 통해서 바로 값을 계산해서 return 하는 것 처럼, 코틀린에서는 if~else 를 바로 계산해서 return 할 수 있다.
그리고 코틀린은 if~else를 expression으로 사용할 수 있기 때문에 3항 연산자가 없다.

if~ else if ~ else 문법도 동일하다.

Java 코드

private String getGrade (int score) {
  if(score >= 90) {
    return "A";
  } else if (score >= 80) {
    return "B";
  } else if (score >= 70) {
    return "C";
  } else {
    return "D";
  }
}

Kotlin 코드

fun getGrade(score: Int): String {
  return if(score >= 90) {
    "A"
  } else if (score >= 80) {
    "B"
  } else if (score >= 70) {
    "C"
  } else {
    "D"
  }
}

간단한 TIP

어떠한 값이 특정 범위에 포함되어 있는지, 포함되어 있지 않은지

if (0 <= score && score <= 100) {...}

=

if (score in 0..100) {...}

예제

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

3. switch와 when (1)

Java 코드

private String getGradeWithSwitch (int score) {
  switch (score / 10) {
    case 9:
      return "A";
    case 8:
      return "B";
    case 7:
      return "C";
    default:
      return "D";
  }
}

Kotlin 코드 ver.1

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

Kotlin 코드 ver.2

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

3. switch 와 when (2)

when (값) {

조건부 → 어떠한 구문

조건부 → 어떠한 구문

else → 어떠한 구문

}

  • 조건부 : 어떠한 expression이라도 들어갈 수 있다. (ex. is Type), 여러 개의 조건을 동시에 검사할 수 있다 (, 로 구분)

Java 코드

private void judgeNumber(int number) {
  if(number == 1 || number == 0 || number == -1) {
    System.out.println("어디서 많이 본 숫자입니다");
  } else {
    System.out.println("1, 0, -1이 아닙니다");
  }
}

Kotlin 코드

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

Java 코드 2

private void judgeNumber2(int number) {
  if (number == 0) {
    System.out.println("주어진 숫자는 0입니다");
    return;
  }
  
  if (number % 2 == 0) {
    System.out.println("주어진 숫자는 짝수입니다");
    return;
  }
  
  System.out.println("주어지는 숫자는 홀수입니다");
}

Kotlin 코드 2

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

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

※ 코틀린에서 조건문을 다루는 방법 ※

  • if / if - else / if - else if - else 모두 Java와 문법이 동일하다.
  • 단 Kotlin에서는 Expression 으로 취급된다.
  • 때문에 Kotlin 에서는 삼항 연산자가 없다.
  • Java의 switch는 Kotlin에서 when으로 대체되었고, when은 더 강력한 기능을 갖는다.

0개의 댓글