개발공부/JAVA의 정석

chapter 4) 조건문과 반복문

기억지기 개발자 2026. 6. 9. 15:09

📍 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)은 중첩 반복문에서 특정 조건을 만족했을 때 바깥 반복문까지 한 번에 종료하고 싶을 때 사용한다.