카테고리 없음

5강 - 선택문

mrgong-robotics 2026. 3. 4. 00:19

프로그램의 작성 순서 정리

1. 프로그램 기본 작성 흐름

일반적인 프로그램의 흐름은 다음과 같습니다.

 
① 데이터 저장 공간 확보
→ ② 입력
→ ③ 데이터 가공(연산)
→ ④ 출력
 

단계별 설명

단계설명예시
데이터 저장 공간 확보 변수, 배열 등을 선언하여 메모리 공간 확보 int a;, int arr[10];
입력 사용자로부터 데이터 입력 scanf()
데이터 가공 연산자 및 계산 수행 +, -, *, /
출력 결과를 화면에 출력 printf()

예시 코드

 
#include <stdio.h>

int main() {
int a, b, sum; // ① 저장 공간 확보
scanf("%d %d", &a, &b); // ② 입력
sum = a + b; // ③ 가공
printf("%d", sum); // ④ 출력
return 0;
}
 

제어문(Control Statement)

프로그램은 위에서 아래로 순차적으로 실행됩니다.
하지만 조건에 따라 실행 여부가 달라질 때 제어문을 사용합니다.

제어문의 종류

구분종류역할
선택문 if, switch~case 조건에 따라 실행문 선택
반복문 while, for, do~while 조건이 참인 동안 반복
분기문 break, continue, goto, return 실행 흐름을 변경

1. 선택문 (if 계열)

1) 기본 if문

사용 목적

  • 하나의 조건을 판단할 때 사용

구조

 
if (조건식) {
실행문;
}
 

특징

  • 조건이 참일 때만 실행
  • 실행문이 2개 이상이면 반드시 {} 사용
  • 가독성을 위해 항상 중괄호 사용 권장

2) if ~ else문

사용 목적

  • 두 가지 중 하나를 반드시 선택해야 할 때 사용

구조

 
if (조건식) {
실행문1;
} else {
실행문2;
}
 

보완 설명

  • else에는 조건식이 없다.
  • 둘 중 하나는 반드시 실행된다.
  • 조건은 한 번만 검사된다 → 효율적

왜 if를 두 번 쓰지 말아야 할까?

 
if (a > 0) {
printf("양수");
}

if (a <= 0) {
printf("0 또는 음수");
}
 

문제점:

  • 조건을 두 번 검사
  • 조건식이 정확하지 않으면 두 개 모두 실행될 수 있음

따라서 둘 중 하나 선택이라면 반드시 if ~ else 사용


3) if ~ else if ~ else문

사용 목적

  • 3가지 이상 중 하나를 선택할 때

구조

 
if (조건1) {
실행문1;
}
else if (조건2) {
실행문2;
}
else {
실행문3;
}
 

중요한 특징

  1. 조건을 위에서 아래로 차례로 검사
  2. 하나가 참이면 나머지는 검사하지 않음
  3. 순서가 매우 중요함

예시

 
if (score >= 90) {
printf("A");
}
else if (score >= 80) {
printf("B");
}
else {
printf("C");
}
 

조건식 작성 시 주의사항

주의사항설명
순서 중요 위 조건이 먼저 참이 되면 아래는 검사 안 함
중복 조건 피하기 논리적 흐름에 맞게 작성
가능성 높은 조건 먼저 검사 횟수 줄여 성능 향상
항상 중괄호 사용 실수 방지

제어문 핵심 정리표

상황사용 문장특징
1가지 실행 여부 판단 if 조건이 참일 때만 실행
2가지 중 하나 선택 if ~ else 반드시 하나 실행
3가지 이상 중 하나 선택 if ~ else if ~ else 위에서부터 순차 검사

제어문 전체 구조 요약표

구분키워드반복 여부조건 개수사용 목적
선택문 if X 1개 단일 조건 판단
선택문 if~else X 1개 2가지 중 선택
선택문 if~else if X 여러 개 다중 조건 선택
반복문 for O 1개 횟수 반복
반복문 while O 1개 조건 반복
반복문 do~while O 1개 최소 1번 실행
분기문 break X - 반복 탈출
분기문 continue X - 다음 반복으로
분기문 return X - 함수 종료

핵심 포인트 정리

  • 프로그램은 기본적으로 순차 실행된다.
  • 조건에 따라 실행을 제어할 때 제어문을 사용한다.
  • if는 1가지 판단
  • if~else는 2가지 중 선택
  • if~else if~else는 3가지 이상 중 선택
  • 조건식의 순서가 매우 중요하다.
  • 항상 중괄호를 사용하는 습관을 들인다.

 

if문 활용과 switch ~ case문 정리

1. if ~ else문은 하나의 문장이다

if ~ else문은 내부 실행문이 여러 줄이어도 전체가 하나의 제어문으로 취급됩니다.

 
if (a > 0) {
printf("양수\n");
printf("입니다.\n");
} else {
printf("음수 또는 0\n");
}
 

위 구조 전체가 하나의 문장입니다.


2. if문 중첩 (Nested if)

1) 개념

if문 안에 또 다른 if문을 사용하는 것을 if문 중첩이라고 합니다.

 
if (조건1) {
if (조건2) {
실행문;
}
}
 

2) 왜 사용하는가?

① 선행조건이 있을 때

어떤 조건을 검사하기 전에 반드시 확인해야 할 조건이 있는 경우 사용합니다.

예시:

 
if (score >= 0 && score <= 100) {
if (score >= 60) {
printf("합격");
}
}
 

→ 점수가 유효 범위인지 먼저 검사
→ 그 다음 합격 여부 판단

불필요한 검사를 줄일 수 있습니다.


② 실행 효율을 높이기 위해

범위를 나눈 후 다시 세부 비교를 하면 평균 검사 횟수를 줄일 수 있습니다.

예:

 
if (num < 50) {
if (num < 25) {
// 처리
} else {
// 처리
}
} else {
if (num < 75) {
// 처리
} else {
// 처리
}
}
 

이처럼 나누어 검사하는 방식은
분할 정복 방식과 유사한 구조입니다.

조건이 많을수록 효율 개선 효과가 있습니다.


3) 중첩 if 사용 시 주의점

주의사항설명
가독성 저하 들여쓰기 깊어질수록 읽기 어려움
논리 오해 가능 선행조건이 꼭 필요한 것처럼 보일 수 있음
복잡성 증가 유지보수 어려움

3. else 결합 문제 (Dangling else 문제)

C에서는 실행문이 한 줄이면 중괄호 {}를 생략할 수 있습니다.

 
if (a > 0)
if (b > 0)
printf("양수");
else
printf("음수");
 

이 코드는 다음과 같이 해석됩니다:

 
if (a > 0) {
if (b > 0)
printf("양수");
else
printf("음수");
}
 

즉, else는 가장 가까운 if와 결합됩니다.

원래 의도와 다르게 동작할 수 있으므로
중첩 구조에서는 반드시 중괄호 사용 권장


4. switch ~ case문

1) 개념

여러 개의 정수 값 중 하나를 선택하여 실행할 때 사용하는 제어문입니다.


2) 기본 구조

 
switch (정수식) {
case 상수1:
실행문;
break;

case 상수2:
실행문;
break;

default:
실행문;
}
 

3) 사용 조건

항목설명
조건식 반드시 정수식
case 값 정수 상수만 가능
default 생략 가능

사용 가능한 것:

  • 정수형 변수
  • 정수 상수
  • 정수 연산 결과

사용 불가:

  • 실수
  • 문자열
  • 범위 조건

5. break의 역할

break는 해당 case 블록을 탈출합니다.

break가 있는 경우

 
switch (num) {
case 1:
printf("1");
break;
case 2:
printf("2");
break;
}
 

→ 해당 case만 실행


break가 없는 경우 (fall-through)

 
switch (num) {
case 1:
printf("1");
case 2:
printf("2");
}
 

num이 1이면:

 
1
2
 

아래 case까지 계속 실행됩니다.


break 사용 원칙

상황사용 여부
일반 다중 선택 반드시 사용
의도적 fall-through 제한적으로 사용
생략 시 반드시 주석으로 설명

6. default의 위치

default는 switch 블록 안 어디에 있어도 됩니다.

 
switch (rank) {
default:
printf("기타");
break;

case 1:
printf("1등");
break;
}
 

동작에는 문제 없습니다.

하지만 보통은 맨 마지막에 작성하여 예외 상황 처리에 사용합니다.


7. switch vs if 비교

구분if문switch문
조건 종류 모든 조건식 가능 정수값만 가능
범위 검사 가능 부적합
가독성 복잡해질 수 있음 값 비교에 적합
break 필요 필요 없음 필요

핵심 요약 정리표

항목핵심 내용
if 중첩 if 안에 if 사용
중첩 목적 선행조건 검사 / 실행 효율 개선
else 결합 문제 else는 가장 가까운 if에 결합
switch 정수 값 비교에 사용
case 정수 상수만 가능
break 블록 탈출, 일반적으로 필수
fall-through break 생략 시 아래 case 실행
default 예외 처리, 위치 자유

전체 개념 흐름 요약

  • if문 중첩은 조건을 단계적으로 검사할 때 사용한다.
  • 가독성 저하에 주의해야 한다.
  • else는 항상 가장 가까운 if와 결합한다.
  • switch는 정수값 기반 다중 선택에 적합하다.
  • break는 대부분 반드시 필요하다.
  • default는 예외 처리를 위해 사용한다.

출처 : 혼자 공부하는 C언어