← Java 강의 목록으로
기초
기초 · 선수: 이전 단원

04. 제어문

코드의 흐름을 갈라거나 반복할 때 쓰는 문장이 **제어문(control flow)** 입니다. Java 의 제어문은 C 와 닮았지만, JDK 14+ 의 **switch expression** 처럼 모던한 형태도 함께 사용합니다.

JavaJDK기초제어문
소요 시간
약 1~1.5시간
난이도
📊 초급
선수 조건
🎯 이전 단원 또는 동등 지식
결과물
코드의 흐름을 갈라거나 반복할 때 쓰는 문장이 **제어문(control flow)** 입니다. Java 의 제어문은 C 와 닮았지만, JDK 14+ 의 **switch expression** 처럼 모던한 형태도 함께 사용합니다.

이 강의에서 배우는 것

  • 1`if` / `else if` / `else` 구조를 사용한다
  • 2새로운 **switch expression** (`->` / `yield`) 문법을 익힌다
  • 3`for`, `while`, `do-while`, **enhanced for** 의 차이를 안다
  • 4`break`, `continue`, 레이블 점프의 의미를 안다

소개

코드의 흐름을 갈라거나 반복할 때 쓰는 문장이 **제어문(control flow)** 입니다. Java 의 제어문은 C 와 닮았지만, JDK 14+ 의 **switch expression** 처럼 모던한 형태도 함께 사용합니다.

핵심 개념

1) `if` / `else if` / `else`

java
int score = 85;
if (score >= 90) {
    System.out.println("A");
} else if (score >= 80) {
    System.out.println("B");
} else {
    System.out.println("C 이하");
}

2) Switch expression (JDK 14+)

java
int day = 3;
String name = switch (day) {
    case 1, 2, 3, 4, 5 -> "평일";
    case 6, 7 -> "주말";
    default -> "오류";
};
System.out.println(name);
  • `case 1, 2, 3 ->` 처럼 여러 값을 한 줄에 묶을 수 있음
  • 값이 여러 줄이 필요하면 블록 + `yield`:
java
  String s = switch (n) {
      case 1 -> "one";
      case 2 -> {
          System.out.println("two!");
          yield "two";
      }
      default -> "?";
  };
  ```

### 3) 반복문 4 가지

for (int i = 0; i < 3; i++) { ... } int j = 0; while (j < 3) { j++; } int k = 0; do { k++; } while (k < 3); int[] nums = {1, 2, 3}; for (int n : nums) { System.out.println(n); } // enhanced for

text

### 4) `break` / `continue`

for (int i = 0; i < 10; i++) { if (i == 3) continue; // 이번 회차 건너뜀 if (i == 6) break; // 반복 종료 System.out.print(i + " "); // 0 1 2 4 5 }

text

핵심 예제

예제 1 — `IfElseDemo.java` : 분기 기본

java
public class IfElseDemo {
    public static void main(String[] args) {
        int score = 72;
        String grade;
        if (score >= 90) grade = "A";
        else if (score >= 80) grade = "B";
        else if (score >= 70) grade = "C";
        else if (score >= 60) grade = "D";
        else grade = "F";
        System.out.println("점수 " + score + " -> " + grade);
    }
}

**실행 결과**

text
점수 72 -> C

**메모:** 한 줄짜리 if 본문은 중괄호를 생략할 수 있지만, **공식 컨벤션은 중괄호 사용**입니다.

예제 2 — `SwitchExpression.java` : `->` / `yield`

java
public class SwitchExpression {
    public static void main(String[] args) {
        int day = 3;
        String kind = switch (day) {
            case 1, 2, 3, 4, 5 -> "평일";
            case 6, 7 -> "주말";
            default -> "오류";
        };
        System.out.println(day + "요일: " + kind);

        int n = 2;
        String word = switch (n) {
            case 1 -> "one";
            case 2 -> {
                System.out.println("two!");
                yield "two";
            }
            default -> "?";
        };
        System.out.println(word);
    }
}

**실행 결과**

text
3요일: 평일
two!
two

**메모:** Switch expression 은 **반드시 값이 결정**되어야 합니다 (`default` 가 필요).

예제 3 — `Loops.java` : for / while / enhanced for

java
public class Loops {
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 1; i <= 5; i++) sum += i;
        System.out.println("1+...+5 = " + sum);

        int j = 0;
        while (j < 3) {
            System.out.print(j + " ");
            j++;
        }
        System.out.println();

        int[] nums = {10, 20, 30};
        for (int n : nums) System.out.print(n + " ");
        System.out.println();
    }
}

**실행 결과**

text
1+...+5 = 15
0 1 2 
10 20 30 

**메모:** **enhanced for** 는 인덱스가 필요 없을 때 가장 안전합니다.

예제 4 — `BreakContinue.java` : break / continue

java
public class BreakContinue {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            if (i == 3) continue;
            if (i == 6) break;
            System.out.print(i + " ");
        }
        System.out.println();

        outer:
        for (int i = 0; i < 3; i++) {
            for (int k = 0; k < 3; k++) {
                if (i + k == 3) break outer;
                System.out.print("(" + i + "," + k + ") ");
            }
        }
        System.out.println();
    }
}

**실행 결과**

text
0 1 2 4 5 
(0,0) (0,1) (0,2) (1,0) (1,1) 

**메모:** **레이블 break** 는 깊은 중첩 탈출에 유용하지만 남용은 가독성을 해칩니다.

전체 예제 코드 (src/)

src/BreakContinue.java

java
public class BreakContinue {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            if (i == 3) continue;
            if (i == 6) break;
            System.out.print(i + " ");
        }
        System.out.println();

        outer:
        for (int i = 0; i < 3; i++) {
            for (int k = 0; k < 3; k++) {
                if (i + k == 3) break outer;
                System.out.print("(" + i + "," + k + ") ");
            }
        }
        System.out.println();
    }
}

src/IfElseDemo.java

java
public class IfElseDemo {
    public static void main(String[] args) {
        int score = 72;
        String grade;
        if (score >= 90) grade = "A";
        else if (score >= 80) grade = "B";
        else if (score >= 70) grade = "C";
        else if (score >= 60) grade = "D";
        else grade = "F";
        System.out.println("점수 " + score + " -> " + grade);
    }
}

src/Loops.java

java
public class Loops {
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 1; i <= 5; i++) sum += i;
        System.out.println("1+...+5 = " + sum);

        int j = 0;
        while (j < 3) {
            System.out.print(j + " ");
            j++;
        }
        System.out.println();

        int[] nums = {10, 20, 30};
        for (int n : nums) System.out.print(n + " ");
        System.out.println();
    }
}

src/SwitchExpression.java

java
public class SwitchExpression {
    public static void main(String[] args) {
        int day = 3;
        String kind = switch (day) {
            case 1, 2, 3, 4, 5 -> "평일";
            case 6, 7 -> "주말";
            default -> "오류";
        };
        System.out.println(day + "요일: " + kind);

        int n = 2;
        String word = switch (n) {
            case 1 -> "one";
            case 2 -> {
                System.out.println("two!");
                yield "two";
            }
            default -> "?";
        };
        System.out.println(word);
    }
}

자주 하는 실수

  1. `if (a = 1)` 처럼 `==` 대신 `=` 사용 → 컴파일 에러(boolean 자리에 int)
  2. 반복 변수 범위를 잘못 잡아 off-by-one (`<` vs `<=`)
  3. classic `switch` 의 `break` 잊고 fall-through
  4. enhanced for 에서 컬렉션 요소를 수정하려다 `ConcurrentModificationException`
  5. switch expression 에 `default` 누락

정리

  • 분기에는 `if` 또는 switch expression
  • 반복에는 `for` / `while` / enhanced for
  • `break`/`continue` 와 레이블 점프는 가끔 유용

과제

# 과제 - 04. 제어문

## 문제 1 — FizzBuzz

  • 파일명: `Homework01.java`
  • 핵심 개념: `for`, `if/else if`

요구사항

  • 1~15 까지 출력합니다.
  • 3의 배수면 `Fizz`, 5의 배수면 `Buzz`, 15의 배수면 `FizzBuzz`, 나머지는 숫자 그대로.

예상 출력

text
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz

힌트

  • 15 의 배수를 **먼저** 확인하세요.

## 문제 2 — 메뉴 선택

  • 파일명: `Homework02.java`
  • 핵심 개념: switch expression

요구사항

  • 정수 `menu = 2` 일 때 switch expression 으로 다음을 반환합니다.
  • 1 → "신메뉴", 2 → "추천", 3, 4 → "베스트셀러", 그 외 → "없음"
  • 결과를 `선택: 추천` 형식으로 출력합니다.

예상 출력

text
선택: 추천

## 문제 3 — 구구단 2 ~ 5 단

  • 파일명: `Homework03.java`
  • 핵심 개념: 중첩 `for`

요구사항

  • 2 단부터 5 단까지 구구단을 출력합니다.
  • 형식은 `2 * 1 = 2` 처럼.
  • 각 단 사이는 빈 줄 한 줄.

예상 출력

text
2 * 1 = 2
2 * 2 = 4
...(생략)

힌트

  • 바깥 for 가 단, 안쪽 for 가 곱하는 수.

## 정답 확인 직접 풀어 본 후 [`answer/`](./answer/) 폴더의 정답과 비교해 보세요.

정답 코드 (homework/answer/)

answer/Homework01.java

java
/** 1~15 의 FizzBuzz. */
public class Homework01 {
    public static void main(String[] args) {
        for (int i = 1; i <= 15; i++) {
            if (i % 15 == 0) System.out.println("FizzBuzz");
            else if (i % 3 == 0) System.out.println("Fizz");
            else if (i % 5 == 0) System.out.println("Buzz");
            else System.out.println(i);
        }
    }
}

answer/Homework02.java

java
/** switch expression 으로 메뉴 결정. */
public class Homework02 {
    public static void main(String[] args) {
        int menu = 2;
        String label = switch (menu) {
            case 1 -> "신메뉴";
            case 2 -> "추천";
            case 3, 4 -> "베스트셀러";
            default -> "없음";
        };
        System.out.println("선택: " + label);
    }
}

answer/Homework03.java

java
/** 2~5 단 구구단. */
public class Homework03 {
    public static void main(String[] args) {
        for (int dan = 2; dan <= 5; dan++) {
            for (int i = 1; i <= 9; i++) {
                System.out.println(dan + " * " + i + " = " + (dan * i));
            }
            System.out.println();
        }
    }
}

직접 해 보기

bash
cd 01_기초/04_제어문/src
javac SwitchExpression.java
java SwitchExpression

다음 단원

[05_메서드](../05_메서드/) — 메서드 선언·오버로딩·`static`·가변 인자를 배웁니다.

예제 코드 / 강의 자료

전체 강의 자료와 예제 코드는 GitHub에서 자유롭게 받아볼 수 있습니다.

GitHub에서 보기 ↗