제어 구조
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
)을 한 번에 다루려면, |
기호로 조건들을 이어서 나열하면 됩니다. 문법만 조금 다를 뿐, 자바에서의 흐름과 같습니다.