C언어 학습 노트 : 6. 제어문#

1. 프로그래밍과 제어 구조#

  • 프로그래밍은 절차적인 흐름을 논리적으로 작성하는 과정이다.
  • 일상적인 행위(예: 기상 → 양치 → 식사)에서도 조건에 따라 분기점이 발생한다.
  • 이러한 분기점을 제어문(control statement) 으로 표현하며, 제어문은 논리적 판단과 조건을 필요로 한다.

2. if#

  • 조건식의 참/거짓에 따라 분기를 수행하는 가장 기본적인 제어문이다.

  • 중첩 if문은 가독성과 성능 측면에서 불리할 수 있다.

    • 가능하다면 2분할(else if 구조 등)로 단순화하는 것이 바람직하다.
  • 단, 현대 CPU와 컴파일러 최적화는 상당히 발달해 있으므로, “성능”보다는 가독성과 유지보수성을 우선적으로 고려하는 것이 좋다.

  • 따라서 if문에서 “고성능”을 기대하기는 어렵고, 주요 목적은 조건 분기 처리에 있다.


3. switch#

  • 정수형 또는 열거형 값을 기준으로 분기를 수행한다.

  • 문법 형식:

    switch (expression) {
        case value1:
            // 실행 코드
            break;
        case value2:
            // 실행 코드
            break;
        default:
            // 기본 실행 코드
    }
    
  • switch문은 조건에 따라 점프 테이블(jump table)로 최적화될 수 있으므로, 항상 “모든 코드를 순차적으로 탐색한다”고 보기는 어렵다.

  • 단, 정수형/열거형만 사용할 수 있고, 문자열이나 복잡한 조건에는 사용할 수 없다는 점이 제한적이다.

  • 가독성이 좋은 분기 처리에는 유용하지만, 성능상의 우위는 컴파일러와 상황에 따라 달라진다.


4. goto#

  • 프로그램의 흐름을 임의의 위치로 강제 이동시키는 제어문이다.

  • 구조화된 프로그래밍 원칙에 어긋나므로 “악마의 코드”라고 불리며, 일반적으로 사용이 권장되지 않는다.

  • 그러나 에러 처리, 중첩 루프 탈출, 리소스 해제와 같은 제한적 상황에서는 실용적인 용도로 사용되기도 한다.

    • 예: 자원 해제를 위한 공통 종료 지점 처리
#include <stdio.h>

int main(void) {
    FILE *fp = fopen("test.txt", "r");
    if (!fp) goto error;
    // 파일 처리 코드
    fclose(fp);
    return 0;

error:
    printf("파일 열기 실패\n");
    return 1;
}

학습 포인트 정리#

  • 프로그래밍의 흐름 제어는 조건과 논리적 판단을 바탕으로 한다.
  • if문은 기본적인 분기문이며, 가독성과 단순화를 우선해야 한다.
  • switch문은 정수형/열거형 기반의 분기 처리에 적합하며, 가독성은 좋지만 적용 범위는 제한적이다.
  • goto문은 일반적으로 지양해야 하지만, 예외적 상황(에러 처리, 자원 해제)에서는 유용하게 사용될 수 있다.