간략하게, 제어문이란 프로그램의 흐름을 제어해주는 문장입니다. 글을 읽듯이 위에서 아래로 읽는 것이 아닌, 마치 설문조사에서의 “4번 문항에 ‘예’를 체크했다면 6번 문항으로 가세요.”와 같은 문장인 것입니다.
조건문 – if
if문 다음 괄호 안의 조건식이 참이면 문장 1을, 거짓이면 문장 1을 실행하지 않습니다. 예를 들면, “20세 이상에게만 술을 판매할 수 있습니다.”를 표현해 봅시다.
- if(나이>20) 이면, 술을 판매할 수 있습니다.
- if(age>20) printf(“술을 판매할 수 있습니다.”); 와 같은 흐름입니다.
- else문을 사용해서 조건식이 거짓일 때의 문장을 정해둘 수도 있습니다. 다중 if – else문을 사용해서, 더 많은 조건에 따라 분기해야 하는 프로그램을 작성할 수도 있습니다. 아래의 예제를 살펴봅시다.
#include <stdio.h>
int main()
{
int age;
printf("손님의 나이를 입력해주세요.\n");
scanf("%d", &age);
if(age>20)
{
printf("술을 판매해도 되겠네요!!");
}
else
{
printf("영업정지 당하고 싶으세요?!");
}
return 0;
}
의 경우처럼입니다. 문장이 간단할 경우, if와 else 다음의 {}중괄호는 작성하지 않아도 됩니다. 아래는 다중 if~else문의 예제입니다.
#include <stdio.h>
int main()
{
int age;
printf("손님의 나이를 입력해주세요.\n");
scanf("%d", &age);
if(age<20)
{
printf("영업 정지입니다.");
}
else if(age == 20)
{
printf("다행이네요!");
}
else
{
printf("안심하세요^^");
}
return 0;
}
나이가 20 이하인 경우, 딱 20인 경우, 그 외의 경우로 분류되어 있는 것을 볼 수 있습니다.
조건문 – switch~case문
switch case문은, 경우의 수가 많을 경우 자주 사용합니다. if~else문과 비슷하나, 결과가 정수형인 경우에만 선택할 수 있습니다.
#include <stdio.h>
int main()
{
int grade;
printf("고등학교 몇 학년이신가요?");
scanf("%d",&grade);
switch(grade) {
case 1:
printf("당신은 1학년이군요!\n");
break;
case 2:
printf("당신은 2학년이군요!\n");
break;
case 3:
printf("당신은 3학년이군요!\n");
break;
default:
printf("다시 입력해주세요.");
break;
}
return 0;
}
와 같이 사용합니다.아래와 같이, 표준화를 시켜볼 수 있겠습니다.
switch(조건식) {
case 상수1:
문장 1;
break; // 꼭 break문으로 루프를 벗어나야 합니다.
case 상수2:
문장 2;
break;
.
.
.
.
case 상수 n:
문장 n;
break;
default:
문장;
break;
} // 여기서 switch-case문의 루프가 끝납니다.
반복문 – for문
특정한 부분을 반복하는 문장입니다.제어 변수 초기식, 조선식, 증감식의 세 부분으로 구성됩니다.
for(제어변수초기식;조건식;증감식)
{
반복될 문장;
}
와 같이 사용합니다. 제어변수 초기식 은 반복문을 제어하는 변수의 초기식으로, 루프가 실행될 때 한 번만 수행됩니다. 조건식 은 반복문이 언제까지 실행될 것인지를 지정하고, 조건식이 참이면 반복문의 루프를 실행하고, 거짓이라면 루프를 빠져나옵니다. 증감식 은 반복 실행될 문장이 모두 실행된 후 실행되며, 보통 제어 변수를 증가시키거나 감소시키는 역할을 합니다.
#include <stdio.h>
int main()
{
printf("Hello!\n")
printf("Hello!\n")
printf("Hello!\n")
printf("Hello!\n")
printf("Hello!\n")
return 0;
}
위의 코드는 Hello를 5번 출력하는 문장입니다. 이것이 1000번이 되고, 10000번이 되고, 수십만 번이 된다면 어떨까요? 아무래도 쓸데없는 용량만 차지하고, 비효율적인 코드가 될 것입니다. for문을 활용해 봅시다.
#include <stdio.h>
int main()
{
int n;
for(n=0;n<5;n++){ //n은 0부터, 5 이하일 때까지, n을 1씩 증가시킵니다.
printf("Hello!\n");
}
return 0;
}
간략하게 이런 흐름일 것입니다.
- n은 0이고(제어변수초기식), n은 0이므로 5보다 작으므로(조건식) printf를 실행하고 나서, n에다가 1을 증가시킵니다.
- n은 1이고, n은 1이므로 5보다 작으므로 printf를 실행하고 나서, n에다가 1을 증가시킵니다.
- 위의 과정들을 반복하다, n이 4에서 5가 되는 시점 루프를 빠져나옵니다.
이러한 경우에는 제어변수만 바꿈으로서 반복되는 횟수를 1000번으로, 10만 번으로 등 언제든지 바꿀 수가 있습니다.
#include <stdio.h>
int main()
{
int n;
for(n=0;n<1000;n++){ // 1000 번을 출력
printf("%d: Hello!\n",n);
}
return 0;
}
for( ; ; ) 로, 초기식, 조건식, 증감식을 모두 생략함으로서 무한루프를 만들 수도 있습니다.
#include <stdio.h>
int main()
{
int n;
for( ; ; ){
printf("Hello!\n");
}
return 0;
}
Hello를 무한으로 출력하는 루프를 만들었습니다.
반복문 – while문
미리 반복 횟수를 알 수 없고, 조건에 따라 반복하는 경우 사용합니다.
while(조건식){
반복될 문장;
}
와 같이 사용합니다. 조건식이 참이면 루프 안의 문장을 반복하고, 거짓이면 루프를 벗어납니다.
#include <stdio.h>
int main()
{
int n = 0;
while(n<10){ //조건식이 참이면,
printf("Hello!\n"); // 루프 안의 문장을 반복(1)합니다.
n++; //루프 안의 문장을 반복(2)합니다.
}
return 0;
}
do~while문을 사용해서 미리 반복 횟수를 알 수는 없으나 최소한 한 번은 반복 문장을 실행할 경우에 많이 사용합니다.
분기문 – break문 , continue문, goto문
break문
- 반복문이나, switch-case문에서 안쪽 루프를 하나 벗어나는 데에 사용합니다.
- 무한 루프에는 특별한 조건에서 루프를 탈출하도록, 반드시 break문을 작성해야 합니다.
continue문
- for, while, do~while문에서 루프의 조건식을 검사하는 부분으로 다시 돌아갑니다.
- break문처럼, 루프를 빠져나가는 것이 아닌 돌던 루프의 continue 아래 부분을 실행하지 않고 다시 조건을 검사하는 부분으로 돌아갑니다.
goto문
- 무조건 해당 레이블로 분기하게 되는 문장입니다.
- 프로그램 어느 곳에라도 레이블을 만들어 바로 이동할 수 있는 편리함이 있습니다.
- 루프가 다중으로 중첩되어있는 경우, break문을 사용하더라도 루프 밖으로 완전히 빠져나올 수 없는데 goto문을 사용한다면 한 번에 다중 루프를 빠져나올 수 있다는 장점이 있습니다.
제가 이해한 C언어의 제어문 정리입니다.