Java시작과 문법

반복 — for, while, 순회 선택 기준

`for`, `for-each`, `while`을 어떤 기준으로 고르는지, `break`와 `continue`가 실제로 어떻게 흐름을 바꾸는지 정리합니다.

마지막 수정 2026년 3월 27일

기본 패턴

java
// 인덱스가 필요한 반복
for (int i = 0; i < names.length; i++) {
    System.out.println(i + ": " + names[i]);
}

// 컬렉션 순회 — 인덱스 불필요
for (String name : names) {
    System.out.println(name);
}

// 종료 시점이 동적
while (!queue.isEmpty()) {
    process(queue.poll());
}

설명

for vs for-each vs while — 반복 방식 선택 기준

세 가지 반복문은 각각 사용 정보가 다릅니다. 어떤 정보가 필요한지에 따라 선택합니다.

for는 시작·끝·증감이 한 줄에 보여 반복 횟수나 인덱스가 핵심일 때 읽기 좋습니다. for-each는 인덱스 없이 원소 자체에만 집중할 수 있어 컬렉션·배열 순회의 기본 선택입니다. while은 조건만 보이므로 종료 시점이 외부 상태에 따라 동적으로 결정될 때 자연스럽습니다.

java
// for — 인덱스 기반 접근이 필요할 때
for (int i = 0; i < list.size() - 1; i++) {
    if (list.get(i) > list.get(i + 1)) swap(list, i, i + 1);
}

// for-each — 원소 순회만 필요할 때 (가장 흔한 패턴)
for (Order order : orders) {
    order.process();
}

// while — 종료 조건이 외부 상태에 따라 결정될 때
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()) {
    String line = scanner.nextLine();
    if (line.equals("quit")) break;
    process(line);
}

break와 continue — 흐름 제어의 정확한 의미

break현재 반복문 자체를 종료합니다. continue현재 회차를 건너뛰고 다음 회차로 넘어갑니다. 두 키워드는 가장 안쪽 반복문에만 적용됩니다.

java
// break — 조건 충족 시 즉시 탈출
for (String name : names) {
    if (name.equals("stop")) break; // 반복문 종료
    System.out.println(name);
}

// continue — 특정 조건은 건너뜀
for (int n : numbers) {
    if (n % 2 == 0) continue; // 짝수는 건너뜀
    System.out.println(n);    // 홀수만 출력
}

// 중첩 반복문에서 외부까지 탈출하려면 label 사용
outer:
for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
        if (grid[i][j] == target) break outer; // 외부 반복문까지 종료
    }
}

do-while — 최소 한 번 실행이 보장되는 반복

do-while은 조건 검사가 반복 이후에 일어납니다. 즉 조건이 거짓이어도 본문이 최소 한 번은 실행됩니다. 입력 유효성 검사처럼 적어도 한 번은 실행해야 하는 상황에 쓰입니다.

java
// 최소 한 번 입력을 받아야 하는 경우
int input;
do {
    System.out.print("1~10 사이 숫자를 입력하세요: ");
    input = scanner.nextInt();
} while (input < 1 || input > 10);

빠른 정리

상황적합한 선택
반복 횟수·인덱스가 필요for (int i = 0; ...)
컬렉션·배열 순회만 필요for (T item : collection)
종료 시점이 동적으로 결정while (condition)
최소 한 번 실행 보장do-while
현재 회차 건너뜀continue
반복문 즉시 탈출break
중첩 반복문 외부까지 탈출label + break

주의할 점

for-each로 순회 중에 컬렉션을 수정하면 ConcurrentModificationException이 발생합니다. 순회 중 삭제가 필요하면 Iteratorremove()removeIf()를 사용하세요.

java
List<String> names = new ArrayList<>(List.of("Kim", "Lee", "Park"));

// ❌ 순회 중 직접 제거 — ConcurrentModificationException
for (String name : names) {
    if (name.equals("Lee")) names.remove(name);
}

// ✅ removeIf — 순회 중 안전하게 제거
names.removeIf(name -> name.equals("Lee"));

// ✅ Iterator.remove() — 전통적인 안전한 방법
Iterator<String> it = names.iterator();
while (it.hasNext()) {
    if (it.next().equals("Lee")) it.remove();
}

참고 링크

1 sources