공부해보잠
제어문 본문
제어문의 개요
컴퓨터 프로그램은 기본적으로 위에서 아래로 차례대로 실행되지만, 특정 조건에 따라 실행 흐름을 변경할 필요가 있음.
이때 프로그램의 실행 순서를 조정하는 명령문을 "제어문" 이라고 함.
제어문을 사용하면 조건에 따라 실행을 다르게 하거나, 특정 작업을 반복 수행할 수 있음.
C 언어에서는 다음과 같은 제어문을 제공함.
분류 | 종류 | 설명 |
조건문 | if문 | 주어진 조건이 참이면 실행 |
다중 if문 | 여러 개의 조건을 검사하여 해당하는 블록 실행 | |
switch문 | 하나의 변수 값을 여러 경우(case)와 비교하여 실행 | |
반복문 | for문 | 정해진 횟수만큼 반복 실행 |
while문 | 조건이 참이면 계속 반복 실행 | |
do-while문 | 최소 1번 실행 후 조건이 참이면 반복 | |
분기문 | goto문 | 프로그램의 특정 위치로 이동 (사용 지양) |
break문 | 반복문이나 switch문을 빠져나갈 때 사용 | |
continue문 | 현재 반복을 건너뛰고 다음 반복으로 진행 |
- 조건문 → 특정 조건이 참일 때만 코드 실행
- 반복문 → 동일한 작업을 여러 번 반복 수행
- 분기문 → 코드 실행 흐름을 제어 (특정 위치로 이동, 반복문 종료 등)
단순 if문
- if 문은 주어진 조건이 참(true)일 때만 특정 코드 블록을 실행하는 제어문
- 단순 if 문은 조건이 하나일 때 사용하는 구조
기본 구조
if (조건식) {
// 조건이 참(true)일 때 실행할 코드
}
조건식이 참이면 {} 안의 코드가 실행됨.
조건이 거짓(false)일 경우, {} 내부 코드는 실행되지 않음
예제: 숫자가 양수인지 확인하는 결과
#include <stdio.h>
int main() {
int num; // 정수를 저장할 변수 num 선언
printf("숫자를 입력하세요: "); // 사용자에게 입력 요청 출력
scanf("%d", &num); // 정수를 입력받아 num 변수에 저장
// 조건문: 입력된 num 값이 0보다 클 경우 실행
if (num > 0) {
printf("입력한 숫자는 양수입니다.\n");
}
// if문 조건이 참이 아니면 이 부분만 실행됨
printf("프로그램 종료\n");
return 0; // 프로그램 종료
}
단순 if 문에 else 사용하기
if-else 개요
- 단순 if 문은 조건이 참(true)일 때만 실행됨.
- else 문을 추가하면, 조건이 거짓(false)일 때 실행할 코드도 지정 가능.
if (조건식) {
// 조건이 참(true)일 때 실행할 코드
} else {
// 조건이 거짓(false)일 때 실행할 코드
}
if 조건이 참이면 {} 안의 코드 실행
if 조건이 거짓이면 else 블록 실행
if-else 예제 : 입력된 숫자가 양수인지 아닌지 판단
#include <stdio.h>
int main() {
int num;
printf("숫자를 입력하세요: ");
scanf("%d", &num);
if (num > 0) {
printf("입력한 숫자는 양수입니다.\n"); //참값일때 표시하는 형식
} else {
printf("입력한 숫자는 양수가 아닙니다.\n"); //거짓값일때 표시하는 형식
}
printf("프로그램 종료\n");
return 0;
}
양수의 값을 입력시 참 조건으로 표시
하지만, 그 외의 값은 else의 입력된 조건으로 표시
다중 if 문
- 여러 개의 조건을 검사하여 해당하는 블록을 실행하는 조건문
- if - else if - else 구조를 사용하여 여러 가지 경우를 처리 가능
- 위에서부터 조건을 차례로 검사하며, 첫 번째로 참(true)인 블록만 실행됨
if (조건1) {
// 조건1이 참일 때 실행
} else if (조건2) {
// 조건1이 거짓이고, 조건2가 참일 때 실행
} else if (조건3) {
// 조건1, 조건2가 거짓이고, 조건3이 참일 때 실행
} else {
// 모든 조건이 거짓일 때 실행
}
첫 번째로 참인 블록만 실행됨
어떤 if 문도 참이 아니면 else 블록 실행됨
예제 : 성적의 비교
#include <stdio.h>
int main() {
int score;
printf("점수를 입력하세요: ");
scanf("%d", &score);
if (score >= 90) { //90점보다 크거나 같을때
printf("등급: A\n"); // A를 표시
} else if (score >= 80) { //80점보다 크거나 같을때
printf("등급: B\n"); //B를 표시
} else if (score >= 70) {//70점보다 크거나 같을때
printf("등급: C\n");//C를 표시
} else if (score >= 60) {//60점보다 크거나 같을때
printf("등급: D\n");//D를 표시
} else { //조건이 존재 하지 않고 모든것이 거짓일때는 else문만 사용
printf("등급: F\n");//F를 표시
}
return 0;
}
다중 if 문 활용 포인트
- 여러 개의 조건을 순차적으로 검사
- 첫 번째로 참(true)인 블록만 실행, 나머지는 건너뜀
- 모든 조건이 거짓일 경우, else 블록이 실행됨
요약
- 단순 if 문 → 하나의 조건만 검사
- if-else 문 → 조건이 참이면 if 실행, 거짓이면 else 실행
- 다중 if 문 (if - else if - else) → 여러 개의 조건을 차례로 검사하며, 첫 번째로 참인 블록만 실행
switch 문
- switch 문은 하나의 변수를 여러 개의 경우(case)와 비교하여 해당하는 코드 블록을 실행하는 조건문
- if-else if 문과 비슷하지만, switch 문은 값이 정확하게 일치하는 경우를 비교할 때 더 효율적
기본 구조
switch (변수) {
case 값1:
// 변수 == 값1일 때 실행할 코드
break;
case 값2:
// 변수 == 값2일 때 실행할 코드
break;
case 값3:
// 변수 == 값3일 때 실행할 코드
break;
default:
// 위의 모든 case 조건에 맞지 않을 때 실행할 코드
}
switch (변수) → 비교할 변수를 설정
case 값: → 변수의 값이 case의 값과 일치하면 실행
break; → 각 case의 실행을 끝내고 switch문을 빠져나감
default: → 모든 case에 해당하지 않을 때 실행 (옵션)
예제 : 요일 출력
#include <stdio.h>
int main() {
int day; // day라는 정수형 변수를 선언 (요일을 숫자로 입력받음)
printf("요일을 숫자로 입력하세요 (1~7): "); // 사용자에게 입력 요청 출력
scanf("%d", &day); // 사용자가 입력한 정수를 day 변수에 저장
switch (day) { // switch 문을 사용하여 입력된 값을 비교
case 1: // 입력값이 1이면 실행
printf("월요일\n"); // "월요일" 출력
break; // break를 만나면 switch 문 종료
case 2:
printf("화요일\n");
break;
case 3:
printf("수요일\n");
break;
case 4:
printf("목요일\n");
break;
case 5:
printf("금요일\n");
break;
case 6:
printf("토요일\n");
break;
case 7:
printf("일요일\n");
break;
default: // 1~7 이외의 값을 입력하면 실행
printf("잘못된 입력입니다.\n"); // 오류 메시지 출력
}
return 0;
}
break;의 역할
- 각 case가 실행된 후 break;가 없으면 다음 case까지 실행됨
- 예제에서 break;가 없으면 입력값이 1일 때 "월요일", "화요일", "수요일" ... 전부 출력됨!
요약
- switch 문을 사용하여 숫자(1~7)에 따라 해당 요일을 출력
- default를 사용하여 잘못된 입력을 처리
- break;를 추가하여 원하는 case만 실행되도록 설정
goto 문
- goto 문은 특정 위치로 프로그램의 실행 흐름을 이동시키는 제어문
- (현재 위치에서 원하는 다른 문장으로 건너뛰어 수행을 계속 하기 위해 사용하는 제어문)
- 코드의 흐름을 바꿀 수 있지만, 가독성이 떨어지고 유지보수가 어려워 잘 사용되지 않음
기본 구조
#include <stdio.h>
int main() {
printf("이 문장은 실행됩니다.\n");
goto jump; // jump 라벨로 이동
printf("이 문장은 건너뛰어집니다.\n"); // 실행되지 않음
jump: // 라벨 (점프 위치)
printf("goto 문으로 이동했습니다.\n");
return 0;
}
- goto jump; → jump: 라벨로 이동하여 실행
- "이 문장은 건너뛰어집니다." → 실행되지 않음
예제 : 10보다 큰 값을 입력할 때까지 입력하기
#include <stdio.h>
int main() {
int a; // 정수형 변수 a 선언
again: // 라벨 정의
scanf("%d", &a); // 사용자 입력 받기
if (a <= 10) // a가 10 이하이면
goto again; // 다시 again 위치로 이동 (입력 반복)
else
printf("%d는 10보다 큽니다.\n", a); // 10보다 클 때만 출력
return 0;
}
goto 문 동작 방식
코드 | 설명 |
again: | goto가 이동할 라벨(위치)을 정의 |
goto again; | again: 위치로 점프(이동) |
if (a <= 10) | a가 10 이하이면 goto again; 실행 (다시 입력 요청) |
else printf("%d는 10보다 큽니다.\n", a); | a가 10보다 크면 메시지를 출력하고 종료 |
goto를 이용해 사용자가 10보다 큰 값을 입력할 때까지 반복 입력을 받는 코드\
goto문의 라벨을 앞에 정의 했을 때 발생하는 문제점
정상작동 :
#include <stdio.h>
int main() {
int num;
start: // 앞쪽에 라벨 정의
printf("숫자를 입력하세요 (0 입력 시 종료): ");
scanf("%d", &num);
if (num != 0)
goto start; // 다시 start 위치로 이동하여 입력 반복
printf("프로그램 종료\n");
return 0;
}
숫자를 입력하세요 (0 입력 시 종료): 5
숫자를 입력하세요 (0 입력 시 종료): 10
숫자를 입력하세요 (0 입력 시 종료): 0
프로그램 종료
goto start; → start:로 이동하여 입력 반복
num == 0이면 goto 실행 안 하고 종료
무한루프 발생 :
#include <stdio.h>
int main() {
loop: // 라벨 정의
printf("무한 반복 중...\n");
goto loop; // 무조건 loop로 이동 → 조건 없이 계속 반복됨!
return 0; // 절대 도달하지 않는 코드 (Unreachable code)
}
무한 반복 중...
무한 반복 중...
무한 반복 중...
무한 반복 중...
(끝없이 반복)
goto loop; → 항상 loop:로 이동하므로 프로그램이 종료되지 않고 무한 반복
해결책
#include <stdio.h>
int main() {
int count = 0;
loop:
printf("반복 중... count = %d\n", count);
count++;
if (count < 5)
goto loop; // 다시 loop 라벨로 이동 (무한 루프 위험)
printf("반복 종료\n");
return 0;
}
반복 중... count = 0
반복 중... count = 1
반복 중... count = 2
반복 중... count = 3
반복 중... count = 4
반복 종료
무한 루프가 발생하지 않는 이유 → count < 5 조건이 있기 때문
만약 count를 증가시키지 않으면 무한 루프 발생!
요약
- goto 문은 라벨(label:)을 뒤쪽에 정의해도 정상적으로 이동 가능
- 하지만 goto를 앞으로 이동하면 코드 실행 순서가 복잡해질 수 있음.
- 뒤로 이동하면 무한 루프 위험이 있으므로 반복문(while, for)을 사용하는 것이 일반적.
출저 및 참고
정보처리 산업기사 기본서(시나공)