본문으로 건너뛰기

조건문

정보처리기사 목차프로그래밍 기초레슨 128 / 233

목차

조건문(conditional statement)은 조건이 참인지 거짓인지에 따라 실행할 문장을 고르는 문장입니다. 점수에 따라 학점을 다르게 매기듯 값에 따라 실행할 줄이 갈릴 때 씁니다. 시험은 어느 갈래가 실행되는지와 switch에서 break가 빠졌을 때의 결과를 묻습니다. 아래 그림은 if 사슬과 switch에서 실행이 어느 줄로 뛰는지 보입니다.

12단계 중 1단계. 이 그림 읽는 법: 지금 실행하는 줄이 칠해지고, 위 칸에 변수의 값이 들어갑니다. 4번 줄 — score에 85를 넣습니다.

1if와 else — 0이 아니면 참

if (조건) 다음 덩어리는 참일 때만, else 덩어리는 거짓일 때만 실행되고, 끝나면 아래 줄로 이어 갑니다. C는 조건의 값이 0이면 거짓, 0이 아니면 음수도 참입니다. 비교식은 참이면 1, 거짓이면 0입니다.

조건값판정
85 >= 900거짓
n % 2 (n은 7)1참
p (p는 NULL)NULL거짓

포인터(pointer)에는 가리키는 칸이 없다는 표시로 NULL을 넣어 둡니다. p가 NULL이면 0과 같아 거짓입니다. 그래서 연결 리스트의 for (p = &a; p; p = p->next)⁠는 p가 NULL이 될 때까지 돕니다. 포인터와 이 for는 연결 리스트 레슨과 32단원에서 배웁니다. 여기서는 NULL이면 거짓이라는 것만 봅니다. if (a = 5)는 비교가 아닌 대입이라 a에 5가 들어가고, 식의 값 5가 0이 아니어서 늘 참입니다.

2else if — 처음 참인 갈래 하나

else if로 이으면 위에서부터 조건을 보다가 처음 참인 갈래 하나만 실행하고 아래 조건은 보지 않습니다. 모두 거짓일 때만 else로 갑니다. 그림의 코드입니다.

#include <stdio.h>

int main(void) {
  int score = 85;
  if (score >= 90) {
    printf("A\n");
  } else if (score >= 80) {
    printf("B\n");
  } else {
    printf("C\n");
  }
  return 0;
}
실행 결과
B

순서가 결과를 바꿉니다. 이 코드에서 score >= 80을 맨 위에 두면 95도 B입니다. 중괄호를 빼면 if는 바로 다음 한 문장만 묶고, 들여 쓴 둘째 줄은 묶지 않습니다.

3switch — 같은 case에서 시작해 break까지

switch (식)은 값이 같은 case로 뛰어 들어가 아래 문장을 차례로 실행하다가 break에서 빠져나갑니다. case는 들어가는 자리일 뿐이라 break가 없으면 다음 case의 문장까지 실행하는데, 이를 흘러내림(fall through)이라 합니다. 같은 case가 없으면 default로 가고, default도 없으면 아무것도 실행하지 않습니다.

예제

찍힐 값을 먼저 정한 뒤 펼치세요.

#include <stdio.h>

int main(void) {
  int score = 85, s = 0;
  switch (score / 10) {
    case 9:
      s += 3;
    case 8:
      s += 2;
    default:
      s += 1;
  }
  printf("%d\n", s);
  return 0;
}
실행 결과 보기
실행 결과
3

85 / 10은 정수끼리 나눈 몫이라 8입니다. case 8로 들어가 s에 2를 더하고, break가 없어 default의 s += 1까지 흘러내립니다. default는 같은 case가 없을 때 들어가는 자리일 뿐이라, 위에서 흘러내려 오면 실행됩니다. case 9는 들어간 자리보다 위라 실행되지 않습니다.

같은 코드를 Java·Python으로

CJavaPython
조건0이면 거짓, 아니면 참boolean만 — if (n)은 컴파일 오류0·빈 문자열·None이 거짓
여러 갈래else ifelse ifelif
없는 값NULL — if (p)nullNone — if p is not None:
switchbreak가 없으면 흘러내림C와 같음없음 — if·elif로 씀(3.10부터 match가 있지만 흘러내리지 않음)

Python은 콜론 뒤에 들여 쓴 줄이 덩어리입니다.

score = 85
if score >= 90:
    print("A")
elif score >= 80:
    print("B")
실행 결과
B

시험 포인트

  • 필기: C는 0이면 거짓, 0이 아닌 값은 음수도 참이고, 포인터는 NULL이면 거짓입니다. else if는 처음 참인 갈래 하나만 실행합니다. switch는 값이 같은 case에서 시작해 break까지 아래로 실행하고, 같은 case가 없으면 default로 갑니다.
  • 실기: 출력을 그대로 씁니다. break가 빠지면 아래 case까지 흘러내리는 것을 놓치지 않습니다. 빈칸에 쓰는 키워드는 break·default, Python은 elif입니다.

확인 문제

1. int a = -1, b = 0;일 때 조건이 참인 것을 고르세요.

  • ① if (b)
  • ② if (a)
  • ③ if (a + 1)
  • ④ if (b > a && b)
정답

②입니다. a는 −1로 0이 아니라 참입니다. 음수도 0이 아니면 참입니다.

  • ① b는 0이라 거짓입니다.
  • ③ a + 1은 0이라 거짓입니다.
  • ④ b > a는 참(1)이지만, && 오른쪽의 b가 0이라 전체가 거짓입니다.

2. 예제 코드의 4번 줄에서 score를 95로 바꿨습니다. 출력을 그대로 쓰세요. score가 100이면 무엇이 찍히는지도 써 보세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

#include <stdio.h>

int main(void) {
  int score = 95, s = 0;
  switch (score / 10) {
    case 9:
      s += 3;
    case 8:
      s += 2;
    default:
      s += 1;
  }
  printf("%d\n", s);
  return 0;
}
정답

받는 답:

실행 결과
6

95 / 10은 9라 case 9에서 시작해 s += 3, s += 2, s += 1을 모두 실행합니다. score가 100이면 100 / 10이 10인데 case 10이 없어 default로 들어가 1이 찍힙니다.

  • 틀리는 꼴 3: case 9의 문장만 실행한다고 봤습니다. break가 없어 끝까지 흘러내립니다.
  • 틀리는 꼴 100일 때 6: 9 이상이면 case 9로 간다고 봤습니다. case는 값이 같은지만 봅니다.
  • 틀리는 꼴 100일 때 0: default를 놓쳤습니다. 같은 case가 없으면 default로 갑니다.

3. 아래 표는 다음 코드의 조건을 차례로 적은 것입니다. (가)·(나)를 채운 뒤 출력을 그대로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

줄조건값판정
5n % 21참
8n % 3(가)거짓
10n > 51(나)
#include <stdio.h>

int main(void) {
  int n = 9;
  if (n % 2) {
    printf("odd ");
  }
  if (n % 3) {
    printf("A\n");
  } else if (n > 5) {
    printf("B\n");
  }
  return 0;
}
정답

(가) 0 · (나) 참이고, 출력은 다음과 같습니다.

실행 결과
odd B

9는 홀수라 9 % 2가 1이고, 0이 아니어서 odd 를 찍습니다. 줄을 바꾸지 않아 다음 출력이 같은 줄에 붙습니다. 9 % 3은 0이라 거짓이고, else if의 9 > 5가 참이라 B를 찍습니다.

  • 틀리는 꼴 odd A: n % 3이 0이라 거짓인 것을 놓쳤습니다. 나머지가 0이면 거짓입니다.
  • 틀리는 꼴 odd와 B를 두 줄로: 6번 줄의 서식 문자열에는 \n이 없어 줄이 바뀌지 않습니다.

4. 다음 코드의 출력을 그대로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

#include <stdio.h>

int main(void) {
  int n = 2, s = 0;
  switch (n * 2) {
    case 2:
      s++;
    default:
      s += 10;
    case 6:
      s += 100;
  }
  printf("%d\n", s);
  return 0;
}
정답

받는 답:

실행 결과
110

n * 2는 4인데 case 4가 없어 default로 들어갑니다. default가 가운데 있어도 들어간 뒤에는 아래로 흘러내려, s에 10을 더하고 case 6의 100까지 더합니다.

  • 틀리는 꼴 10: default에서 멈춘다고 봤습니다. break가 없으면 아래 case로 흘러내립니다.
  • 틀리는 꼴 111: n을 그대로 2로 보고 case 2부터 실행했습니다. switch가 보는 값은 n * 2인 4입니다.

5. 다음 (가)~(다)에 들어갈 키워드를 대소문자까지 코드 그대로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

  • (가) C의 switch에서 식의 값과 같은 case가 하나도 없을 때 실행이 들어가는 이름표
  • (나) C의 switch 안에서 만나는 즉시 switch 밖의 다음 줄로 나가게 하는 문장
  • (다) Python에서 앞 조건이 거짓일 때만 다음 조건을 보게 이어 붙이는 키워드(C에서는 낱말 둘로 씁니다)
정답

받는 답: (가) default · (나) break · (다) elif

(가)는 '같은 case가 없을 때', (나)는 'switch 밖으로 나감', (다)는 'Python에서 이어 붙이는 조건'이 실마리입니다.

  • 같은 이름의 다른 꼴: Default·BREAK — C와 Python은 대소문자를 가려, 키워드는 소문자 그대로 써야 합니다.
  • 틀리는 꼴 continue — (나)에: 반복에서 이번 바퀴의 남은 문장을 건너뛰는 키워드입니다(반복문과 추적 표). switch를 끝내는 것은 break입니다.
  • 틀리는 꼴 else if — (다)에: C·Java의 꼴입니다. Python에서는 한 낱말 elif입니다.

처음이라면: C 언어 과목(준비 중)의 'if와 else: 중괄호 덩어리' · 'else if로 여러 갈래' · 'switch와 break' 레슨에서 같은 규칙을 처음부터 천천히 봅니다.

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

정보처리기사 목차로