제어 구조

if문 본문 한 줄

자바

if (x == 1) System.out.println(x);

자바에서 if는 주어진 조건이 참일 때만, 주어진 명령문을 실행합니다.

스칼라

if (x == 1) println(x)

스칼라에서 if도 비슷한 방식으로 씁니다.

if문 본문 여러 줄

자바

if (x == 1) {
  System.out.println("x는 1입니다:");
  System.out.println(x);
}

if문 안에 여러 구문을 넣을 때는 중괄호({})로 코드 블록을 묶습니다.

스칼라

if (x == 1) {
  println("x는 1입니다:")
  println(x)
}

스칼라도 마찬가지입니다.

if, else if, else

자바

if (x < 0)
  System.out.println("음수");
else if (x == 0)
  System.out.println("zero");
else
  System.out.println("양수");

if조건이 거짓일 때, 이어서 다음 if문으로 중첩하기도 합니다.

스칼라

if (x < 0)
  println("음수")
else if (x == 0)
  println("0")
else
  println("양수")

스칼라에서도 마찬가지로 else if로 조건문을 중첩하기도 합니다.

조건에 따른 결괏값

자바

public int min(int a, int b) {
  if (a < b)
    return a;
  else
    return b;
}

자바에서 if문은, 별도로 결괏값을 반환하는 것이 아니기 때문에, return키워드를 써서, 조건 참거짓에 따른 반환값을 결정할 수 있습니다.

스칼라

def min(a: Int, b: Int): Int =
  if (a < b) a else b

스칼라에서 if문은, 참거짓에 따른 세부 평가값이 전체 if문의 최종 결괏값이 됩니다. 따라서, 별도의 return 키워드 없이도, 전체 메서드의 반환값을 바로 줄 수 있습니다.

자바의 3항 연산자

자바

int minVal = (a < b) ? a : b;

자바의 3항 연산자가, 스칼라의 if문과 비슷하게 작동합니다.

스칼라

val minVal = if (a < b) a else b

스칼라에서는 if문이 자바의 3항 연산자와 동일하게 작동하기 때문에, 별도로 3항 연산자는 없습니다.

while 반복문

자바

while (i < 3) {
  System.out.println(i);
  i++;
}

자바에서 while문은 주어진 조건식이 참인 동안 반복됩니다.

스칼라

while (i < 3) {
  println(i)
  i += 1
}

스칼라에서도 같은 방식으로 작동하지만, 문법만 조금 다릅니다. 스칼라에는 ++ 메서드가 따로 없기 때문에, += 메서드를 써서 처리했습니다.

for 반복문 한 줄짜리

자바

for (int i: ints) System.out.println(i);

자바에서 for문으로 컬렉션이나 배열의 모든 요소에 대해 반복되는 일을 할 수 있습니다.

스칼라

for (i <- ints) println(i)

스칼라도 동일한 방식으로 for 표현식을 쓸 수 있어요. <- 기호를 쓴다는 점이 다릅니다.

for문 여러 줄짜리

자바

for (int i: ints) {
    int x = i * 2;
    System.out.printf("i = %d, x = %d\n", i, x);
}

반복할 본문이 여러 줄이라면 중괄호({})로 묶습니다.

스칼라

for (i <- ints) {
  val x = i * 2
  println(s"i = $i, x = $x")
}

스칼라에서도 마찬가지입니다.

다중 for

자바

for (int i: ints1) {
  for (int j: chars) {
    for (int k: ints2) {
      System.out.printf(
        "i = %d, j = %d, k = %d\n", i, j, k);
    }
  }
}

자바에서 for문을 여러 겹 쌓으려면, 반복할 본문 안에 다시 for문을 넣으면 됩니다.

스칼라

for {
  i <- 1 to 2
  j <- 'a' to 'b'
  k <- 1 to 10 by 5
} println(s"i = $i, j = $j, k = $k")

스칼라에서는 조금 다른 모양으로 for문을 중첩(nesting)합니다. 반복할 제너레이터(generator)에 반복 변수들을 연이어 나열하면, 결과적으로 중첩된 for문과 같아집니다. 제너레이터를 여러 줄에 걸쳐 나열할 때 중괄호로 감싼 점에 유의해주세요.

선별 조건이 있는 for

자바

List<Integer> ints =
  List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

for (int i: ints) {
  if (i % 2 == 0 && i < 5) {
    System.out.println(i);
  }
}

자바에서 반복문을 돌면서, 특정 조건에 따라서 선택적으로 처리하려면, for문 안에서 if문을 쓰면 됩니다.

스칼라

val ints = (1 to 10).toList

for {
  i <- ints
  if i % 2 == 0
  if i < 5
} println(i)

스칼라에서는 for문의 제네레이터에서 if조건을 추가해 반복 대상을 선별할 수 있습니다. 마치, for문 안에 if문이 들어있는 것과 같은 효과를 냅니다.

switch / match (1)

여러 경우를 따지는 조건문이 필요할 때, if문을 여러 번 이어서 써도 되지만, switch문을 써서 한 번에 조건들을 나열하면 편리합니다.

자바

String weekdayAsString = "";
switch (weekday) {
  case 1: weekdayAsString = "월요일";
          break;
  case 2: weekdayAsString = "화요일";
          break;
  default: weekdayAsString = "기타";
          break;
}

switch문으로, 특정 조건이 일치하는 경우(case)에 따른 명령을 수행할 수 있습니다.

스칼라

val weekdayAsString = weekday match {
  case 1 => "월요일"
  case 2 => "화요일"
  case _ => "기타"
}

스칼라에서는 패턴 부합(pattern matching) 기능으로 여러 조건을 한 번에 검사할 수 있습니다. 어떤 값 이후에 match 키워드로 시작하며, 여러 case조건을 순서대로 나열하면 됩니다. 위 예제에서 마지막 case는 밑줄(_)로 나머지 모든 경우를 처리하고 있습니다. 또, 별도의 break 키워드가 없고, case문의 결괏값이 전체 패턴 부합 기능의 결괏값이 된다는 점에 유의하세요.

패턴 부합 기능에 대해서는, 나중에 더 자세히 다룹니다.

switch / match (2)

자바

String numAsString = "";
switch (i) {
  case 1: case 3:
  case 5: case 7: case 9:
    numAsString = "홀수";
    break;
  case 2: case 4:
  case 6: case 8: case 10:
    numAsString = "짝수";
    break;
  default:
    numAsString = "범위초과";
    break;
}

자바에서 switch문을 쓸 때에 여러 조건을 한 번에 다룰 때에는, case 조건을 연이어 쓰면 됩니다. (특정 case 조건에 일치하더라도, break 키워드를 만나기 전까지는 이어서 다음 조건을 검사하게 됩니다)

스칼라

val numAsString = i match {
  case 1 | 3 | 5 | 7 | 9 => "홀수"
  case 2 | 4 | 6 | 8 | 10 => "짝수"
  case _ => "범위초과"
}

스칼라에서 여러 조건(case)을 한 번에 다루려면, | 기호로 조건들을 이어서 나열하면 됩니다. 문법만 조금 다를 뿐, 자바에서의 흐름과 같습니다.