C 언어에서 break와 continue를 조건문과 함께 활용하기

C 언어는 반복문과 조건문을 통해 복잡한 로직을 구현할 수 있도록 설계되었습니다. 이 중 breakcontinue 키워드는 반복문의 흐름을 제어하여 효율적인 프로그램 작성을 가능하게 합니다. 본 기사에서는 breakcontinue의 기본 개념, 조건문과 함께 사용하는 방법, 그리고 실용적인 활용 사례를 중심으로 이 키워드들의 잠재력을 탐구합니다. 이를 통해 반복문을 보다 효과적으로 제어하는 방법을 익힐 수 있습니다.

목차

break의 기본 개념


break는 반복문이나 switch문 내에서 사용되어 현재 실행 중인 루프나 선택문을 즉시 종료하는 키워드입니다.
반복문에서 break를 만나면 반복 조건이나 루프의 나머지 부분을 무시하고 루프를 빠져나가게 됩니다.

사용 목적


break는 주로 다음과 같은 상황에서 사용됩니다:

  • 특정 조건이 만족되었을 때 반복문을 종료하고 다음 코드로 넘어가기 위해
  • switch문에서 특정 케이스가 실행된 후 나머지 케이스를 무시하기 위해

기본 구문


아래는 break의 기본 사용법입니다:

#include <stdio.h>

int main() {
    for (int i = 0; i < 10; i++) {
        if (i == 5) {
            break; // 반복문 종료
        }
        printf("i = %d\n", i);
    }
    return 0;
}

실행 결과


위 코드는 i가 5가 되는 순간 반복문을 종료하며, 출력은 다음과 같습니다:

i = 0  
i = 1  
i = 2  
i = 3  
i = 4  

break를 적절히 활용하면 반복문이 불필요하게 실행되는 것을 방지하여 코드의 효율성을 높일 수 있습니다.

continue의 기본 개념


continue는 반복문 내에서 사용되어 현재 반복의 나머지 코드를 건너뛰고 다음 반복을 실행하도록 하는 키워드입니다.
continue를 만나면 반복문의 조건을 다시 평가하며, 이후의 실행을 생략하고 루프의 다음 단계로 넘어갑니다.

사용 목적


continue는 주로 다음과 같은 상황에서 사용됩니다:

  • 특정 조건을 만족할 때 나머지 코드를 실행하지 않고 다음 반복으로 넘어가기 위해
  • 불필요한 코드 실행을 줄이고 논리 흐름을 간결하게 유지하기 위해

기본 구문


아래는 continue의 기본 사용법입니다:

#include <stdio.h>

int main() {
    for (int i = 0; i < 10; i++) {
        if (i % 2 == 0) {
            continue; // 나머지 코드를 건너뛰고 다음 반복으로 이동
        }
        printf("i = %d\n", i);
    }
    return 0;
}

실행 결과


위 코드는 i가 짝수일 때 printf를 건너뛰고 다음 반복으로 넘어가며, 출력은 다음과 같습니다:

i = 1  
i = 3  
i = 5  
i = 7  
i = 9  

continue를 활용하면 특정 조건에서 실행을 건너뛰어 효율적인 반복문 제어가 가능합니다. 이는 복잡한 로직에서도 코드의 가독성과 유지보수성을 높이는 데 기여합니다.

조건문과 break의 조합


조건문과 break를 결합하면 특정 조건이 충족되었을 때 반복문을 즉시 종료할 수 있습니다. 이 조합은 반복문 내에서 불필요한 추가 작업을 방지하고 효율성을 높이는 데 유용합니다.

기본 사용 예제


아래는 break와 조건문을 결합한 간단한 예제입니다:

#include <stdio.h>

int main() {
    int numbers[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int target = 6;

    for (int i = 0; i < 10; i++) {
        if (numbers[i] == target) {
            printf("Target %d found at index %d\n", target, i);
            break; // 조건이 충족되면 반복문 종료
        }
    }

    return 0;
}

실행 결과


위 코드는 target 값(6)을 찾으면 루프를 종료하며, 출력은 다음과 같습니다:

Target 6 found at index 5

활용 사례

  1. 검색 알고리즘: 배열, 리스트, 또는 문자열 내에서 특정 값을 찾는 경우.
  2. 조기 종료: 필요 조건을 충족했을 때 추가 계산을 방지하여 성능 최적화.
  3. 에러 처리: 특정 조건에서 루프를 종료하고 에러를 처리하거나 반환하기 위해.

주의사항

  • break를 사용하면 반복문의 자연스러운 흐름이 중단되므로, 코드 가독성을 해치지 않도록 주의해야 합니다.
  • 너무 자주 또는 부적절하게 사용하면 코드가 예측하기 어려워질 수 있습니다.

조건문과 break를 적절히 활용하면 복잡한 로직을 간단하고 명확하게 구현할 수 있습니다.

조건문과 continue의 조합


조건문과 continue를 결합하면 특정 조건을 만족할 때 반복문의 나머지 작업을 건너뛰고 다음 반복을 실행할 수 있습니다. 이 조합은 특정 조건에서 불필요한 코드를 생략하는 데 유용합니다.

기본 사용 예제


아래는 조건문과 continue를 결합한 간단한 예제입니다:

#include <stdio.h>

int main() {
    for (int i = 1; i <= 10; i++) {
        if (i % 2 == 0) {
            continue; // 짝수일 경우 다음 반복으로 이동
        }
        printf("i = %d\n", i);
    }

    return 0;
}

실행 결과


위 코드는 i가 짝수일 때 printf를 건너뛰며, 출력은 다음과 같습니다:

i = 1  
i = 3  
i = 5  
i = 7  
i = 9  

활용 사례

  1. 특정 조건 건너뛰기: 예를 들어, 배열 내에서 특정 값을 무시하고 작업을 진행.
  2. 루프 최적화: 조건 충족 시 불필요한 연산을 줄이고 바로 다음 반복으로 이동.
  3. 필터링: 특정 기준에 맞는 항목만 처리하거나 출력.

활용 예제: 필터링


아래는 양수만 출력하는 프로그램입니다:

#include <stdio.h>

int main() {
    int numbers[] = {-5, 3, -2, 7, 0, 8, -1};
    int size = sizeof(numbers) / sizeof(numbers[0]);

    for (int i = 0; i < size; i++) {
        if (numbers[i] <= 0) {
            continue; // 음수와 0은 건너뛰기
        }
        printf("Positive number: %d\n", numbers[i]);
    }

    return 0;
}

출력 결과

Positive number: 3  
Positive number: 7  
Positive number: 8  

주의사항

  • continue를 남발하면 루프의 흐름이 복잡해질 수 있으므로 신중히 사용해야 합니다.
  • 특정 조건을 스킵했을 때 로직의 완전성이 유지되는지 확인이 필요합니다.

조건문과 continue의 조합은 코드를 간결하고 효율적으로 작성하는 데 도움을 줄 수 있습니다.

break와 continue의 주요 차이점


breakcontinue는 반복문 내에서 사용되지만, 동작 방식과 사용 목적이 다릅니다. 이 두 키워드의 차이점을 명확히 이해하면 적절한 상황에서 효과적으로 활용할 수 있습니다.

기능적 차이점

  1. break
  • 현재 실행 중인 반복문을 즉시 종료하고, 반복문 이후의 코드로 흐름을 이동시킵니다.
  • 반복문뿐만 아니라 switch문에서도 사용됩니다.
  1. continue
  • 현재 반복을 중단하고 다음 반복을 실행합니다.
  • 반복문의 조건을 다시 평가하여 루프를 이어갑니다.

코드 비교


아래는 동일한 반복문에서 breakcontinue의 차이를 보여주는 예제입니다:

#include <stdio.h>

int main() {
    printf("Using break:\n");
    for (int i = 1; i <= 5; i++) {
        if (i == 3) {
            break; // 반복문 종료
        }
        printf("i = %d\n", i);
    }

    printf("\nUsing continue:\n");
    for (int i = 1; i <= 5; i++) {
        if (i == 3) {
            continue; // 현재 반복 건너뛰기
        }
        printf("i = %d\n", i);
    }

    return 0;
}

실행 결과

Using break:
i = 1
i = 2

Using continue:
i = 1
i = 2
i = 4
i = 5

주요 차이점 요약

구분breakcontinue
동작 방식반복문을 즉시 종료현재 반복 건너뛰고 다음 반복 실행
반복문 종료 여부종료종료하지 않음
적용 위치반복문, switch반복문 내
사용 목적조건 충족 시 반복문 종료특정 조건에서 실행을 생략하고 계속

활용 예시

  • break: 찾고자 하는 값을 발견한 후 반복문 종료
  • continue: 유효하지 않은 데이터를 무시하고 다음 데이터를 처리

주의사항

  • 가독성 유지: breakcontinue를 적절히 사용하지 않으면 코드 흐름이 복잡해질 수 있습니다.
  • 논리적 완전성 검토: 사용 전후의 로직이 예기치 않게 중단되거나 누락되지 않도록 주의해야 합니다.

breakcontinue는 반복문을 제어할 수 있는 강력한 도구로, 상황에 따라 적절히 활용하면 코드의 효율성과 가독성을 모두 높일 수 있습니다.

실용적인 응용 사례


breakcontinue는 반복문의 흐름을 제어할 수 있는 강력한 도구입니다. 아래에서는 실제 프로그래밍에서 자주 사용되는 실용적인 사례를 통해 이 키워드들의 활용 방법을 살펴봅니다.

1. 특정 값 찾기: break


break는 반복문에서 특정 값을 찾을 때 매우 유용합니다. 예를 들어, 배열에서 특정 요소를 찾고, 찾으면 검색을 중단하는 경우입니다:

#include <stdio.h>

int main() {
    int numbers[] = {10, 20, 30, 40, 50};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    int target = 30;

    for (int i = 0; i < size; i++) {
        if (numbers[i] == target) {
            printf("Found %d at index %d\n", target, i);
            break; // 목표를 찾았으므로 종료
        }
    }

    return 0;
}


실행 결과:

Found 30 at index 2

2. 유효 데이터 처리: continue


continue는 반복문에서 유효하지 않은 데이터를 건너뛰고, 유효한 데이터만 처리하는 데 유용합니다. 예를 들어, 양수만 합산하는 코드:

#include <stdio.h>

int main() {
    int numbers[] = {-3, 5, -1, 7, 0, 4};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    int sum = 0;

    for (int i = 0; i < size; i++) {
        if (numbers[i] <= 0) {
            continue; // 음수와 0은 건너뜀
        }
        sum += numbers[i];
    }

    printf("Sum of positive numbers: %d\n", sum);

    return 0;
}


실행 결과:

Sum of positive numbers: 16

3. 중첩 루프 탈출: break


break를 활용해 중첩 루프를 빠져나오는 경우도 흔합니다.

#include <stdio.h>

int main() {
    for (int i = 1; i <= 3; i++) {
        for (int j = 1; j <= 3; j++) {
            if (i * j == 4) {
                printf("Breaking out at i=%d, j=%d\n", i, j);
                break; // 내부 루프 종료
            }
        }
    }

    return 0;
}


실행 결과:

Breaking out at i=2, j=2

4. 데이터 필터링: continue


파일에서 특정 조건에 맞는 데이터를 필터링하여 출력하는 경우:

#include <stdio.h>

int main() {
    int data[] = {12, 0, -3, 25, -7, 18};
    int size = sizeof(data) / sizeof(data[0]);

    for (int i = 0; i < size; i++) {
        if (data[i] <= 0) {
            continue; // 양수가 아닌 값은 무시
        }
        printf("Valid data: %d\n", data[i]);
    }

    return 0;
}


실행 결과:

Valid data: 12  
Valid data: 25  
Valid data: 18  

요약

  • break는 특정 조건에서 반복을 완전히 종료하는 데 사용됩니다.
  • continue는 특정 조건에서 현재 반복을 건너뛰고 다음 반복으로 이동하는 데 유용합니다.
  • 두 키워드를 적절히 활용하면 코드의 효율성과 가독성을 동시에 높일 수 있습니다.

자주 발생하는 문제와 해결 방법


breakcontinue는 반복문을 제어하는 강력한 키워드이지만, 부적절하게 사용하면 예상치 못한 오류나 비효율적인 코드가 발생할 수 있습니다. 아래에서는 일반적으로 발생하는 문제와 이를 해결하는 방법을 설명합니다.

1. 무한 루프 문제


문제:
break 또는 continue를 사용할 때 반복문 종료 조건을 잘못 설정하면 무한 루프에 빠질 수 있습니다.
예제:

#include <stdio.h>

int main() {
    int i = 0;

    while (1) {
        printf("i = %d\n", i);
        if (i == 5) {
            continue; // 조건을 업데이트하지 않음
        }
        i++;
    }

    return 0;
}


위 코드는 continue로 인해 i++이 실행되지 않아 i가 5에서 멈추고 무한 루프에 빠집니다.

해결 방법:
continue 사용 시에도 반복 조건을 적절히 업데이트해야 합니다.

if (i == 5) {
    i++; // 조건 업데이트
    continue;
}

2. 중첩 루프 탈출 문제


문제:
중첩된 루프에서 break를 사용할 경우, 내부 루프만 종료되고 외부 루프는 계속 실행됩니다.
예제:

for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        if (i * j == 4) {
            break; // 내부 루프만 종료
        }
    }
}

해결 방법:
중첩된 루프를 완전히 탈출하려면 플래그 변수나 goto를 사용하는 방법이 있습니다.

int exit_flag = 0;

for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        if (i * j == 4) {
            exit_flag = 1;
            break;
        }
    }
    if (exit_flag) break;
}

3. 조건 로직의 혼란


문제:
continue와 복잡한 조건문을 조합하면 코드가 복잡해져 가독성이 떨어질 수 있습니다.
예제:

for (int i = 1; i <= 10; i++) {
    if ((i % 2 == 0 && i != 4) || (i > 7 && i < 10)) {
        continue; // 조건이 복잡하여 이해하기 어려움
    }
    printf("i = %d\n", i);
}

해결 방법:
조건을 간단히 작성하거나 별도의 함수로 분리하여 가독성을 개선합니다.

int should_skip(int i) {
    return (i % 2 == 0 && i != 4) || (i > 7 && i < 10);
}

for (int i = 1; i <= 10; i++) {
    if (should_skip(i)) continue;
    printf("i = %d\n", i);
}

4. `break` 또는 `continue`의 남용


문제:
breakcontinue를 과도하게 사용하면 코드의 흐름이 비정상적으로 분산되어 가독성과 디버깅이 어려워집니다.

해결 방법:

  • 가능하면 명시적인 조건문을 사용하여 흐름을 제어합니다.
  • 간단한 루프에서는 키워드 사용을 최소화합니다.

요약

  • 반복 조건 업데이트를 항상 명확히 합니다.
  • 중첩된 루프에서 적절한 탈출 방법을 선택합니다.
  • 조건 로직을 간단하게 유지하고, 필요한 경우 별도로 분리합니다.
  • breakcontinue는 간결하고 명확하게 사용하여 코드 가독성을 유지합니다.

문제를 사전에 인지하고 적절히 해결하면, breakcontinue를 안전하고 효과적으로 사용할 수 있습니다.

연습 문제와 해설


breakcontinue의 활용 능력을 향상시키기 위해 몇 가지 연습 문제를 제공하며, 해설을 통해 이해를 돕습니다.

연습 문제 1: 특정 값 찾기


문제:
아래 배열에서 값이 25인 요소를 찾고, 해당 인덱스를 출력한 후 반복문을 종료하세요.

#include <stdio.h>

int main() {
    int numbers[] = {10, 15, 25, 35, 45};
    int size = sizeof(numbers) / sizeof(numbers[0]);

    // 코드를 작성하세요

    return 0;
}

해설:
break를 사용해 조건을 만족하면 반복문을 종료합니다.

for (int i = 0; i < size; i++) {
    if (numbers[i] == 25) {
        printf("Found 25 at index %d\n", i);
        break; // 루프 종료
    }
}

연습 문제 2: 특정 값 건너뛰기


문제:
1부터 10까지의 숫자 중에서 5와 7은 출력하지 않고 나머지 숫자만 출력하세요.

#include <stdio.h>

int main() {
    for (int i = 1; i <= 10; i++) {
        // 코드를 작성하세요
    }
    return 0;
}

해설:
continue를 사용해 특정 값을 건너뜁니다.

for (int i = 1; i <= 10; i++) {
    if (i == 5 || i == 7) {
        continue; // 건너뛰기
    }
    printf("i = %d\n", i);
}

연습 문제 3: 중첩 루프 종료


문제:
아래 2차원 배열에서 값이 8인 요소를 찾으면 중첩 루프를 종료하세요.

#include <stdio.h>

int main() {
    int matrix[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    // 코드를 작성하세요

    return 0;
}

해설:
플래그 변수를 사용해 중첩 루프를 종료합니다.

int found = 0;

for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        if (matrix[i][j] == 8) {
            printf("Found 8 at [%d][%d]\n", i, j);
            found = 1; // 플래그 설정
            break;
        }
    }
    if (found) break; // 외부 루프 종료
}

연습 문제 4: 유효 데이터 필터링


문제:
다음 배열에서 양수만 출력하세요.

#include <stdio.h>

int main() {
    int data[] = {-10, 20, -30, 40, 0, 50};
    int size = sizeof(data) / sizeof(data[0]);

    // 코드를 작성하세요

    return 0;
}

해설:
continue를 사용해 조건에 맞지 않는 값을 건너뜁니다.

for (int i = 0; i < size; i++) {
    if (data[i] <= 0) {
        continue; // 음수와 0은 건너뛰기
    }
    printf("Positive number: %d\n", data[i]);
}

요약


연습 문제를 통해 breakcontinue의 기본적인 사용법과 실용적인 활용 방식을 익힐 수 있습니다. 반복문 제어에 익숙해지면 더 복잡한 로직에서도 효과적으로 활용할 수 있습니다.

목차