선택 제어문

코딩하는 기린·2022년 3월 3일
0

C

목록 보기
5/13

C 프로그램은 기본적으로 순차적으로 명령을 처리하지만 순서를 제어해야할 필요가 있을 때는 명령문 중 '제어문'을 사용하여 순서를 제어할 수 있습니다.
그 중 '선택 제어문'은 주어진 조건에 따라 실행이 분기되어 다른 명령을 수행하도록하는 제어문입니다.

if(~else if~else)문

'if문'은 조건에 따라 실행이 두방향으로 분기합니다. 기본형은 아래와 같습니다.

if(조건문){
	명령문;
}

if문의 조건문을 검사하여 참이면 if문의 명령문을 실행하고, 거짓이면 if문의 명령문을 건너뛰고 다음에 오는 명령문을 다시 순차적으로 실행합니다.

int g=10;

if(g==1){
	printf("g의 값은 1입니다.\n");
}
printf("g의 값은 1이 아닙니다.\n");

/*
if문의 명령문이 한 줄이므로 중괄호를 생략하여 작성 할 수도 있습니다.

int g=10;

if(g==1)
	printf("g의 값은 1입니다.\n");
    
printf("g의 값은 1이 아닙니다.\n");
*/
/*
또는 위처럼 줄을 바꾸지않고 같은 줄에 적을 수도 있습니다.

int g=10;

if(g==1) printf("g의 값은 1입니다.\n");

printf("g의 값은 1이 아닙니다.\n");
*/
g의 값은 1이 아닙니다.

위의 예시에서 조건을 검사하여 참이면 if문에 중괄호로 묶인 명령문을 수행한 뒤 다음 명령문을 수행합니다. 거짓이면 if문에 중괄호로 묶인 명령문을 건너뛰고 다음 명령문을 순차적으로 수행합니다.

만약 위의 예시에서 if문의 조건이 아래처럼 참이라면

int g=1;

if(g==1){
	printf("g의 값은 1입니다.\n");
}
printf("g의 값은 1이 아닙니다.\n");
g의 값은 1입니다.
g의 값은 1이 아닙니다.

if문의 명령문이 수행되고, 이어서 다음에 오는 명령문도 수행됩니다.

그런데 결과값이 위처럼 순차적으로 모두 나오는 것이 아닌, 선택적으로 나오게 하고싶다고한다면,
'if~else문'을 사용할 수 있습니다. 기본형은 아래와 같습니다.

if(조건문){
	명령문1
}
else{
	명령문2
}

if~else문은 if문과 달리 if문의 조건을 검사하여 참이면 if문의 명령문을 실행하고, 거짓이면 else문의 명령문을 실행합니다. 그 후에 다음에 오는 명령문을 다시 순차적으로 실행합니다.

int g=7;

if(g==1){
	printf("g의 값은 1입니다.\n");
}
else{
	printf("g의 값은 1이 아닙니다.\n");
}
printf("g의 값은 7입니다.\n");
g의 값은 1이 아닙니다.
g의 값은 7입니다.

조건을 검사하여 if문의 조건과 맞지않아 else문의 명령문만 수행되고 순차적으로 다음 명령어도 수행하였습니다.

그렇다면 여기서 더 나아가서 if~else문처럼 '이거 아니면 이거빼고 전부 다일 때'가 아닌 좀 더 선택지를 늘릴 수도 있습니다.
이럴 때 바로 'if~else if~else문'을 사용하면됩니다. 기본형은 아래와 같습니다.

if(조건문1){
	명령문1;
}
else if(조건문2){
	명령문2;
}
else if(조건문3){
	명령문3;
}

...

else if(조건문n){
	명령문n;
}
else{
	명령문n+1;
}

if~else if~else문은 if~else문과 달리 if문처럼 조건을 사이에 더 넣을 수 있습니다.
if문과 else문은 처음과 끝에 한번씩만 와야되지만, else if문은 사이에 여러번 사용이 가능합니다.

int g=7;

if(g==1){
	printf("g의 값은 1입니다.\n");
}
else if(g>1 && g<=5){
	printf("g의 값은 1보다 크고 5보다 작거나 같습니다.\n");
}
else{
	printf("g의 값은 1보다 작거나 5보다 큽니다.\n");
}
printf("g의 값은 7입니다.\n");
g의 값은 1보다 작거나 5보다 큽니다.
g의 값은 7입니다.

첫 예시에 if문만 사용한 것처럼 else문은 반드시 작성할 필요는 없습니다. if문에 else문을 붙이면 if~else문이 되고, if~else if문에 else문을 붙이면 if~else if~else문이 되는 것 입니다. 조건문에는 앞서 공부했던 연산자를 활용하여 범위를 더 확장시킬 수도 있습니다.
그리고 이러한 if를 활용한 선택 제어문은 그안에 또 선택 제어문을 사용할 수도 있습니다.
즉, 중첩해서 사용이 가능합니다.

switch~case문

비교해야될 조건이 늘어난다면 위처럼 if~else if~else문을 사용한다고 해도, 복잡해 질 수 밖에 없습니다.
그럴 때는 모든 상황을 다 커버할 수는 없지만 특정한 상황이라면 'switch~case문'을 사용하여 해결할 수 있습니다.

switch(수식){
	case1:
    	명령문1;
    case2:
    	명령문2;
   	
    ...
    
    case 값n:
    	명령문n;
    default:
    	명령문n+1;
}

switch~case문에서는 switch문의 수식의 결과를 각각의 'case 값'으로 정하며, 각 case는 if, else if의 역할을 합니다. 수식에는 연산식이나 특정 변수를 사용할 수 있고, 문자를 포함한 정수형 수식만 사용 가능합니다. 그리고 case 값은 '범위가 아닌 단 하나의 값'만 사용해야하며, 해당하는 case 값들이 없다면 else와 같은 역할로 'default'를 사용합니다.

int a=9;

switch(a%7){
    case 0:
        printf("나머지는 0입니다.\n");
    case 1:
        printf("나머지는 1입니다.\n");
    case 2:
        printf("나머지는 2입니다.\n");
    default:
        printf("나머지는 3~6 사이입니다.\n");
}
나머지는 2입니다.
나머지는 3~6 사이입니다.

그런데 조건에 문제가 없음에도 case 2의 명령문에서 멈추지않고 다음에 오는 경우들도 모두 수행되었습니다. 이는 switch~case문의 특징때문인데, 값을 비교하다가 참인 값과 일치하는 case 값을 만나면 다음에 오는 나머지 case문들은 비교없이 그냥 수행하기때문입니다. 그래서 이를 막기위해 'break'문을 사용합니다.

int a=9;

switch(a%7){
    case 0:
        printf("나머지는 0입니다.\n");
        break;
    case 1:
        printf("나머지는 1입니다.\n");
        break;
    case 2:
        printf("나머지는 2입니다.\n");
        break;
    default:
        printf("나머지는 3~6 사이입니다.\n");
        break;
}
나머지는 2입니다.

이렇게 break문을 사용하면 해당 case문을 수행하는 즉시 중괄호를 벗어나 switch~case문 다음에 오는 명령문을 다시 순차적으로 수행합니다.

goto문

'goto문'은 무조건적 분기 명령으로, 보통 루프(loop)가 많이 중첩되어있을 때 한번에 빠져나가기위해 사용하며, 현재 위치에서 원하는 곳으로 이동해 거기부터 다시 순차적으로 명령을 수행합니다. 하지만 '반복문의 밖에서 안'으로나 'if문의 밖에서 안'으로는 이동할 수 없습니다.

...

코드

...

goto 레이블 이름;

...

코드2

...

레이블 이름:

위와 같은 형태를 띄며, 처음부터 순차적으로 실행하다가 goto를 만나면 코드2 부분을 실행하지않고 레이블 이름: 위치로 이동하여 다시 순차적으로 명령을 수행합니다.

int a=2;

switch(a){
    case 0:
        goto zero;
        break;
    case 1:
        goto one;
        break;
    case 2:
        goto two;
        break;
    default:
        goto infinity;
        break;
}

zero:
printf("Welcome to zero!\n");
one:
printf("Welcome to one!\n");
two:
printf("Welcome to two!\n");
infinity:
printf("Welcome to infinity!\n");
Welcome to two!
Welcome to infinity!
profile
Coding Giraffe.

0개의 댓글