Java continue 문 설명: 구문, 예제, 모범 사례 및 대안

1. Introduction

Java 프로그래밍을 배우면서 루프 처리는 필수적인 기본 구조 중 하나입니다. 그 중 continue 문은 종종 간과되기 쉽지만, 올바르게 사용하면 코드 가독성과 효율성을 크게 향상시킬 수 있습니다.

continue 를 사용하면 특정 조건이 충족될 때 루프의 현재 반복만 건너뛰고 다음 반복으로 진행할 수 있습니다. 예를 들어 배열에서 특정 값을 제외하거나 불필요한 계산을 피하고 싶을 때 유용합니다.

이 글에서는 java continue 의 기본 사용법부터 실용 예제, 그리고 다른 루프 제어문과의 차이점까지 모두 설명합니다. continue 를 완전히 이해하지 못한 채 사용해 본 초보자든, 중급 개발자든 이 가이드를 통해 자신 있게 활용할 수 있게 될 것입니다.

기본부터 고급 사용법까지 java continue 를 단계별로 살펴보겠습니다.

2. Basic Syntax and Execution Flow

continue 문은 주로 루프 내부에서 사용됩니다. Java에서는 for, while, do-while 등 다양한 루프 구조에서 사용할 수 있습니다. 이 섹션에서는 기본 문법과 동작 방식을 설명합니다.

2-1. Basic Syntax of continue

continue 의 문법은 매우 간단합니다:

for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) {
        continue; // Skip this iteration when the condition is met
    }
    System.out.println(i);
}

위 예제에서 i 가 짝수일 때 continue 가 실행되어 System.out.println(i) 가 건너뛰어집니다. 그 결과 홀수만 출력됩니다.

2-2. Loop Flow and How continue Works

continue 가 실행되면 현재 반복에서 이후의 모든 문장이 건너뛰어지고 즉시 다음 반복으로 이동합니다.

다음은 for 루프를 이용한 간략한 흐름도입니다:

  1. 루프 초기화 (예: int i = 0 )
  2. 조건 검사 (예: i < 10 )
  3. 루프 본문 실행
  4. continue 가 실행되면 남은 문장을 건너뛰기
  5. 증감 단계 (예: i++ )
  6. 2단계로 돌아가기

요약하면, continue“현재 반복만 건너뛰기”라는 의미입니다. 복잡한 루프에서도 건너뛰기 조건을 명확히 제어하고 싶을 때 유용합니다.

2-3. When Is continue Useful?

특정 조건에 따라 처리를 건너뛰고 싶을 때, 예를 들어 잘못된 값이나 오류를 무시하고 다음 반복으로 넘어가고 싶을 때 특히 도움이 됩니다.

다음 섹션에서는 효과적인 사용법을 보여주는 실용 예제를 살펴보겠습니다.

3. Practical Code Examples

이 섹션에서는 continue 를 활용한 구체적인 예제를 소개하여 실제 사용 상황을 시각화합니다.

3-1. Using continue in a for Loop: Skipping Specific Values

예를 들어 1부터 10 사이에서 3의 배수를 건너뛰고 싶다면:

for (int i = 1; i <= 10; i++) {
    if (i % 3 == 0) {
        continue; // Skip multiples of 3
    }
    System.out.println(i);
}

이 코드는 3, 6, 9를 제외한 모든 숫자를 출력합니다.

3-2. Using continue in a while Loop: Input Validation

사용자 입력을 처리할 때 음수와 같은 잘못된 값을 무시하고 싶을 수 있습니다:

Scanner scanner = new Scanner(System.in);
int count = 0;
while (count < 5) {
    System.out.print("Please enter a positive integer: ");
    int num = scanner.nextInt();
    if (num < 0) {
        System.out.println("Negative values are ignored.");
        continue;
    }
    System.out.println("Entered value: " + num);
    count++;
}

여기서는 음수 값이 건너뛰어 count 가 증가하지 않습니다.

3-3. Using continue in Enhanced for (for-each) Loops

컬렉션을 순회할 때도 continue 를 사용할 수 있습니다:

String[] names = {"田中", "", "佐藤", "鈴木", ""};
for (String name : names) {
    if (name.isEmpty()) {
        continue;
    }
    System.out.println(name);
}

빈 문자열이 아닌 경우만 출력됩니다.

4. Clear Differences Between continue and `break

The continue 문은 종종 break와 비교되지만, 그 동작은 근본적으로 다릅니다.

4-1. 주요 차이점

  • continue : 현재 반복을 건너뛰고 다음 반복으로 진행합니다.
  • break : 전체 루프를 즉시 종료합니다.

4-2. 코드 비교

continue 예시:

for (int i = 1; i <= 10; i++) {
    if (i % 2 != 0) {
        continue;
    }
    System.out.println(i);
}

break 예시:

for (int i = 1; i <= 10; i++) {
    if (i == 5) {
        break;
    }
    System.out.println(i);
}

4-3. 사용 가이드라인

  • 루프의 일부를 건너뛰고 싶을 때 continue를 사용합니다.
  • 루프를 완전히 종료하고 싶을 때 break를 사용합니다.

5. 고급 사용법: 라벨이 있는 continue

Java는 라벨이 있는 continue를 지원하며, 이를 통해 중첩된 루프에서 어느 루프를 계속할지 지정할 수 있습니다.

5-1. 기본 구문

outerLoop:
for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= 3; j++) {
        if (j == 2) {
            continue outerLoop;
        }
        System.out.println("i=" + i + ", j=" + j);
    }
}

5-2. 실행 결과

i=1, j=1
i=2, j=1
i=3, j=1

5-3. 가독성 고려사항

라벨이 있는 continue는 중첩 루프 제어를 단순화할 수 있지만, 과도하게 사용하면 가독성이 떨어집니다. 적절히 제한해서 사용하는 것이 권장됩니다.

5-4. 무한 루프 위험

루프 조건을 업데이트하는 로직을 건너뛰는 경우 무한 루프가 발생할 수 있으니 주의하세요.

6. 모범 사례와 함정

6-1. continue 남용 피하기

남용하면 코드 이해가 어려워질 수 있습니다.

6-2. 무한 루프 방지

int i = 0;
while (i < 5) {
    if (i == 2) {
        continue;
    }
    i++;
    System.out.println(i);
}

이 코드는 i++가 건너뛰어지기 때문에 무한 루프가 발생합니다.

6-3. 팀 개발 시 고려사항

팀 환경에서는 continue를 신중히 사용하고, 의도를 명확히 문서화하세요.

6-4. 대안 고려

때로는 로직을 재구성하거나 조기 반환을 사용하면 continue가 필요 없게 될 수 있습니다.

7. 더 정교한 대안

7-1. Stream API

Arrays.stream(names)
      .filter(name -> !name.isEmpty())
      .forEach(System.out::println);

7-2. 메서드 분해

for (User user : userList) {
    if (isValid(user)) {
        process(user);
    }
}

7-3. 대규모 개발 관점

가독성과 유지보수성을 우선시하여 Streams와 깔끔한 설계가 선호됩니다.

8. 요약

8-1. 핵심 개념

continue는 현재 반복을 건너뛰고 다음 반복으로 이동합니다.

8-2. break와의 차이점

  • break: 루프를 종료합니다
  • continue: 한 번의 반복을 건너뜁니다

8-3. 모범 사례

  • 과도한 사용을 피합니다
  • 무한 루프를 방지합니다
  • 가독성 있는 코드를 작성합니다

8-4. 최신 Java 기능 활용

Streams와 메서드 분해는 종종 더 안전한 대안을 제공합니다.

8-5. 실습 과제

  • 조건에 따라 요소를 건너뛰기
  • breakreturn과 비교하기
  • Stream API를 사용해 재구현하기

FAQ

Q1. continuebreak 중 어떻게 선택해야 하나요?

continue는 반복을 건너뛰고, break는 루프를 종료할 때 사용합니다.

Q2. 라벨이 있는 continue는 언제 사용해야 하나요?

중첩 구조에서 외부 루프를 건너뛰어야 할 때만 사용합니다.

Q3. Stream API가 continue를 대체할 수 있나요?

네, filter를 사용하면 동일한 효과를 얻을 수 있습니다.

Q4. 무한 루프를 어떻게 방지할 수 있나요?

continue 전에 루프 카운터가 업데이트되는지 확인하세요.

Q5. continue가 성능에 영향을 미치나요?

적절히 사용한다면 큰 성능 영향을 주지 않습니다.

Q6. 프로덕션 코드에서 continue를 권장하나요?

간단한 경우에는 허용되지만, 명확성과 유지보수성을 우선시해야 합니다.