본문으로 건너뛰기

조건문과 반복문

조건문(Conditional Statements)

코드 흐름을 분기하는 문장이다.

if 문

int a = 7;
if (a > 10) {
printf("a는 10보다 큼");
} else if (a > 5) {
printf("a는 5보다 큼");
} else {
printf("a는 5보다 작거나 같음");
}
  • if: 조건이 참(true)이면 실행
  • else if: 다음 조건이 참(true)면 실행
  • else: 모든 조건이 거짓(false)면 실행

순차 평가

  • if - else if - else 구조는 위에서 아래로 조건을 평가한다.(Top-Down)
  • 참인 조건이 발견되면 해당 블록에서 실행하고 끝남(이후 조건은 검사하지 않음)

조건 순서

  • 조건을 평가하는 순서에 따라 결과가 달라질 수 있다.
  • 구체적이고 좁은 조건을 위쪽에 배치하는 것이 좋음
int score = 85;
if (score > 60) {
printf("합격");
} else if (score > 80) { // 검사되지 않음
printf("우수");
}
합격

switch 문

int n = 2;
switch (n) {
case 1:
printf("n은 1");
break;
case 2:
printf("n은 2");
break;
default:
printf("n은 1도 2도 아님");
}
  • 하나의 값을 여러 경우(case)로 나누어 처리한다.
  • break를 명시적으로 써서 블록을 탈출한다.

fall-through

  • case 끝에 break를 쓰지 않으면 다음 case로 흘러(fall through) 넘어간다.
int n = 1;
switch (n) {
case 1:
case 2:
printf("1 또는 2");
break;
default:
printf("1도 2도 아님");
}

if vs switch 선택 기준

  • if를 사용하는 경우
    • 범위조건(>, <, >=, <=) 이 필요한 경우
    • 복잡한 조건식이 필요한 경우
    • 변수 여러 개를 비교해야 할 경우

if는 단순 값 비교를 넘어 다양한 형태의 복합 조건을 표현할 수 있다.

  • switch를 사용하는 경우
    • 하나의 변수를
    • 여러 개의 상수 값 중 하나와 비교할 때
    • 각 분기마다 간단한 처리를 할 때

switch는 특정 값(case)을 기반으로 분기할 때 효율적이다.

반복문(Loops)

특정 조건을 만족하는 동안 코드를 반복 실행한다.

while 문

int i = 0;
while (i < 3) {
printf("%d\n", i);
i++;
}
  • 조건이 참이면 계속 반복
  • 조건을 먼저 평가

do-while 문

int i = 0;
do {
printf("%d\n", i);
i++;
} while (i < 3);
  • 무조건 한 번 실행하고, 그 다음 조건을 평가

for 문

for (int i = 0; i < 3; i++) { // (초기식; 조건식; 증감식)
printf("%d\n", i);
}
  • 초기화 -> 조건 평가 -> 실행 -> 증감 순서로 동작
    • int i = 0(초기식): 제어 변수 초기화
    • i < 3(조건식): 반복마다 평가. 참이면 실행, 거짓이면 종료
    • i++(증감식): 제어 변수 업데이트

반복문 제어

  • continue: 건너뛰고 다음 반복을 진행
  • break: 반복문 탈출

함수 내 반복문의 경우 return으로 함수를 종료해서 탈출할 수 있다.

for vs while 선택 기준

  • for를 사용하는 경우

    • 반복 횟수가 명확하게 정해져 있는 경우
    • 초기화 -> 조건 평가 -> 증감의 흐름이 자연스러운 경우
  • while을 사용하는 경우

    • 반복 횟수를 사전에 알 수 없는 경우
    • 조건이 만족될 때까지 반복하고 싶은 경우
    • 반복 제어가 더 유연한 조건이 기반인 경우