📍 if문에 중괄호를 생략하면 생길 수 있는 실수
자바에서 if문에 중괄호({})를 생략하면 조건문에 속하는 코드는 단 한 줄뿐이다.
따라서 들여쓰기가 같아 보이더라도 두 번째 줄부터는 if문과 무관하게 항상 실행된다.
int age = 15;
if (age >= 19)
System.out.println("성인입니다.");
System.out.println("영화 예매가 가능합니다.");
위 코드를 보면 두 문장 모두 if문에 속한 것처럼 보이지만 실제로는 첫 번째 출력문만 조건문의 대상이다.
실행 결과
영화 예매가 가능합니다.
의도대로라면 다음과 같이 중괄호를 사용해야 한다.
if (age >= 19) {
System.out.println("성인입니다.");
System.out.println("영화 예매가 가능합니다.");
}
들여쓰기는 사람이 보기 위한 규칙일 뿐이고, 자바는 중괄호가 없으면 바로 다음 한 문장만 조건문에 포함된다고 해석한다.
📍 Java의 새로운 Switch식
Before
switch (operator) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
default:
throw new IllegalArgumentException();
}
After
double result = switch (operator) {
case '+' -> num1 + num2;
case '-' -> num1 - num2;
case '*' -> num1 * num2;
case '/' -> num1 / num2;
default -> throw new IllegalArgumentException();
};
새로운 문법에서는 ->를 사용하여 결과를 바로 반환할 수 있으며, break를 작성할 필요가 없다. 또한 fall-through가 발생하지 않아 코드의 안정성이 높아진다.
[ Switch Expression 문법 ]
1. 여러 조건은 , 로 묶을 수 있다.
String season = switch (month) {
case 12, 1, 2 -> "Winter";
case 3, 4, 5 -> "Spring";
case 6, 7, 8 -> "Summer";
case 9, 10, 11 -> "Autumn";
default -> "Unknown";
};
2. 단일 실행문은 -> 사용
case '+' -> num1 + num2;
기존의
case '+':
result = num1 + num2;
break;
와 동일한 역할을 한다.
3. 여러 줄을 실행할 경우 {} 블록 사용
case '/' -> {
if (num2 == 0) {
throw new ArithmeticException();
}
yield num1 / num2;
}
4. 블록 내부에서는 yield로 값 반환
yield num1 / num2;
switch 식의 결과값을 반환하는 역할을 한다.
주의사항
1. break를 사용하지 않는다.
case '+' -> num1 + num2;
이미 결과를 반환하기 때문에 break가 필요 없다.
2. 여러 줄을 작성할 경우 반드시 yield를 사용해야 한다.
잘못된 코드
case '+' -> {
num1 + num2;
}
올바른 코드
case '+' -> {
yield num1 + num2;
}
3. 모든 경우에 대한 결과를 반환해야 한다.
잘못된 코드
double result = switch (operator) {
case '+' -> num1 + num2;
};
올바른 코드
double result = switch (operator) {
case '+' -> num1 + num2;
default -> throw new IllegalArgumentException();
};
4. switch식 전체 뒤에는 세미콜론 ( ; )이 필요하다.
double result = switch (operator) {
case '+' -> num1 + num2;
default -> 0;
};
switch 자체가 하나의 표현식(Expression)이기 때문이다.
정리
- , : 여러 조건을 하나의 case로 묶는다.
- -> : 해당 조건의 결과를 반환하거나 실행한다.
- yield : 블록 내부에서 switch 식의 결과를 반환한다.
- break : 사용하지 않는다.
- default : 가능한 경우 작성하는 것이 좋다.
- switch 식 끝에는 ;을 작성해야 한다.
📍 for문에서 변수 두 개를 동시에 사용할 수 있을까?
for문은 하나의 변수만 사용할 수 있다고 생각하기 쉽지만, 초기식과 증감식에서는 쉼표(,)를 사용하여 여러 변수를 함께 사용할 수 있다.
예를 들어 아래 코드는 i는 증가하고 j는 감소하면서 반복된다.
for(int i = 1, j = 10; i <= 10; i++, j--) {
System.out.println(i + " " + j);
}
실행 결과
1 10
2 9
3 8
...
10 1
이처럼 for문의 초기식과 증감식에는 여러 변수를 사용할 수 있어 서로 반대 방향으로 이동하는 로직을 간결하게 구현할 수 있다. 다만 조건식에는 하나의 boolean 표현식만 사용할 수 있으므로, 여러 조건이 필요할 경우 && 또는 || 연산자를 사용해야 한다.
for(int i = 0, j = 10; i < 10 && j > 0; i++, j--) {
...
}
이 문법은 배열 뒤집기, 투 포인터(Two Pointer) 알고리즘 등에서 자주 활용된다.
📍 이름 붙은 반복문(Label)은 언제 사용할까 ?
일반적인 break문은 자신이 속한 가장 가까운 반복문만 종료한다.
따라서 중첩 반복문에서 특정 조건을 만족했을 때 모든 반복문을 한 번에 종료하고 싶다면 원하는 동작을 수행하기 어렵다.
예를 들어 2차원 배열에서 특정 값을 찾는 상황을 생각해보면
int[][] arr = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] == 5) {
break; // 안쪽 for문만 종료
}
}
}
위 코드의 break는 안쪽 반복문만 종료할 뿐 바깥 반복문은 계속 실행된다.
이럴 때 이름 붙은 반복문(Label)을 사용할 수 있다.
int[][] arr = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
search:
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] == 5) {
System.out.println("찾았다!");
break search; // 바깥 반복문까지 종료
}
}
}
search:는 반복문의 이름(Label)이고, break search;는 해당 이름이 붙은 반복문 전체를 종료하라는 의미이다.
정리
이름 붙은 반복문(Label)은 중첩 반복문에서 특정 조건을 만족했을 때 바깥 반복문까지 한 번에 종료하고 싶을 때 사용한다.

'개발공부 > JAVA의 정석' 카테고리의 다른 글
| chapter 3) 자바 연산자 정리: 정수 나눗셈, 오버플로우, 형변환 주의점 (0) | 2026.06.08 |
|---|---|
| chapter 2-1) 변수 variable (0) | 2026.06.05 |
| chapter 2-2) 자주 사용되는 타입 간의 변환 (0) | 2026.06.05 |
| chapter 1) 왜 자바는 main()을 찾을까? JVM과 스프링의 실행 시작점 이해하기 (0) | 2026.06.04 |