BLOG ARTICLE If | 1 ARTICLE FOUND

  1. 2007.06.14 6. 제어문

6.1 조건문
조건문은 주어진 조건에 맞는 실행을 선택하는 역활을 합니다. C에는 if와 switch가 있습니다.

1) if / else if / else

if는 대부분의 언어에 비슷하게 존재하는 대표적인 조건문으로 아래와 같은 문법으로 사용합니다.

if([조건]) { [코드] }

if문 다음의 괄호 안의 [조건]이 0이 아니면 다음에 나오는 [코드]를 실행하고, 0이면 실행하지 않습니다. 일단 사용 예 부터 보겠습니다.

int a = 2;
if(a < 3)
{
    printf("TRUE");
}

위의 코드는 (a < 3)이 참(1)이므로 {}내의 내용이 실행되어 printf를 출력합니다. 만약 변수 a를 int a = 4;와 같이 변경하면 거짓(0)이 되므로 printf의 내용을 출력하지 않습니다.

if 다음 실행해야 될 코드가 한줄일 경우에는 아래와 같이 {}를 생략할 수 있습니다. 이는 나중에 나올 for, while문 등도 마찬가지 입니다.

if(a < 3)
    printf("TRUE");

if는 else if, else와 더불어 여러 조건들을 검사 할 수 있습니다. else if는 if의 조건 다음에 나오는 조건들을 검사합니다. else 는 if나 else if의 마지막에 위치하면 위의 조건들이 모두 일치하지 않을 때만 실행됩니다.

if와 else는 한 if문에서 하나씩만 올 수 있지만, else if는 여러개가 올 수 있습니다. 사용예는 아래와 같습니다.

int a = 2;
if(a < 3)
    printf("one");
else if(a < 6)
    printf("two");
else
    printf("three");
   
첫번째 if문은 a가 3보다 작을 경우 실행되고, 위와 같이 a가 2일 경우에는 "one"을 출력하고 그 다음에 오는 else if, else의 코드들은 실행되지 않습니다.

만약 a가 4로  첫번째 if문의 조건이 거짓(0)이되면, 그 다음의 else if문에서 다음 조건을 검사합니다. a가 4면 6보다 작으므로 "two"를 출력하고, 뒤의 else문은 실행이 되지 않습니다.

마지막 else의 경우는 위의 if, else if의 두 조건인 a가 3보다 작지 않고 6보다 작지 않은 조건에 걸리지 않는다면 "three"를 출력합니다.

>> 조건 연산자
간단하게 한가지 조건을 검사하고 변수에 값을 저장 할 때는 이전 연산자에서 잠시 본 조건 연산자를 사용할 수 있습니다. 조건 연산자는 아래와 같이 사용합니다.

[조건] ? [A] : [B];

위의 조건은 if문 괄호내의 조건과 동일합니다. [조건]이 참(1)일 경우 [A]의 값을 반환하고, 거짓(0)일 경우 에는 [B]의 값을 반환합니다. 아래는 사용 예 입니다.

int a = 2;
int b;
b = (a < 3) ? 100 : 200;

a = 2이므로 (a < 3)는 참(1)입니다. 참이므로 첫번째 숫자인 100을 반환합니다. 이를  if문을 사용하는 동일한 코드를 작성하면 아래와 같습니다.

if(a < 3)
    b = 100;
else
    b = 200;


2) switch

if문과 더불어 많이 사용하는 조건문이 switch문 입니다. 한 변수(int, char)에 대하여 많은 조건을 검사해야 할 경우에는 switch문이 가독성이 좋을 수도 있습니다. switch문은 아래와 같이 사용할 수 있습니다.

switch([조건])
{
    case [값] :
        [code];
        break;
    case [값] :
        [code];
        break;
    default :
        [code];
        break;
}

switch  괄호내에 있는 [조건]의 값이 각각의 case의 값과 일치할 경우에는 해당 case 문내의 [code]가 실행 됩니다. case 문 내의 코드가 끝나는 곳에는 break;가 있어야 다음 case 문으로 실행이 되지 않습니다.

default는 생략이 가능하며 if문의 else와 마찬가지로 위의 모든 case 조건에 해당 사항이 없을 때, default내의 [code]가 실행됩니다. 아래는 사용 예입니다.

int a = 2;

switch(a)
{
    case 1:
        printf("1\n");
        break;
    case 2:
        printf("2\n");
        break;
    case 3:
        printf("3\n");
        break;
    default:
        printf("not 1 or 2 or 3");
        break;
}    

위에서 변수 a의 값을 1, 2, 3, 그 외 다른 수로 변경하면서 컴파일/실행해 보시면 switch문을 이해하실 수 있습니다. a의 값을 1부터 차례대로 증가시키면서 변경하면 1, 2, 3, not 1 or 2 or 3이 출력 됩니다.

만약 case 2의 break;를 삭제하면 2가 되더라도 다음 break;를 만나는 case 3까지 실행됩니다. 코드는 아래와 같습니다.

switch(a)
{
    case 1:
        printf("1\n");
        break;
    case 2:
        printf("2\n");
    case 3:
        printf("2 or 3\n");
        break;
    default:
        printf("not 1 or 2 or 3");
        break;
}
   
위의 코드는 다른 부분은 위와 동일 하지만, a가 2일 경우에는 case 2에 break;가 없기 때문에 2를 출력하고 case 3까지 내려와 2 or 3을 출력한 후에 break;문을 만나 switch문을 나가게 됩니다.


6.2 반복문
어떤 작업에 대하여 일정한 반복이 필요할 경우에 사용되는 반복문입니다. C의 for와 while에 대하여 알아 보겠습니다.

1) for

for는 아래와 같이 사용합니다.

for([초기화]; [조건]; [변경])
{
    [코드]
}

[초기화] 부분은 for문이 반복되기 전에 한번만 실행되며, 이곳에서 for문의 반복 횟수를 나타내는 변수등을 초기화 합니다.

[조건]은 항상 반복전에 검사되며 참(1)일 경우에는 계속 진행되고, 거짓(0)일 경우에는 for문을 종료합니다.

[변경]은 [코드]가 실행 된 후에 실행되는 부분으로 일반적으로 반복 횟수를 나타내는 변수를 증감하여, for문이 원하는 [조건]에서 종료할 수 있도록 합니다.

사용예는 아래와 같습니다.

int i;
for(i = 0; i < 10; i++)
{
    printf("%d\n", i);
}

위의 for문이 10번 반복되면서 0~9까지 출력하는 소스입니다. 위의 소스는 아래와 같이 실행됩니다.
  1. 초기화 부분에서 i = 0로 저장됩니다.
  2. i < 10인지 검사하고, 참이면 코드 부분이 실행되고 거짓이면 for문이 종료됩니다.
  3. printf가 i를 출력합니다.
  4. i가 1 증가 됩니다.
위에서 2~4 부분은 4까지 오면 다시 2로 가서 계속 반복 됩니다. 이렇게 반복되면서 printf가 9를 출력하고 i가 10이 될 때에는  2에서 i < 10 조건이 거짓(0)이 되므로 for문이 종료됩니다.


2) while

while은 아래와 같이 사용됩니다.

while([조건])
{
    [코드]
}

[조건]이 참(1)일 동안은 [코드]가 계속 반복해서 실행됩니다. 위의 0부터 1까지 출력하는 for문을 while로 변경하면 다음과 같습니다.

int i = 0;
while(i < 10)
{
    printf("%d\n", i++);
}

for문도 마찬가지지만 while 사용시에는 특히 (i < 10)의 조건 부분이 원하는 만큼만 반복하고 나올 수 있도록 유의하여야 합니다. 위에 printf문의 i++가 같이 i가 증가되는 부분이 없으면, (i < 10)은 항상 참이 되므로, 프로그램이 무한이 반복되는 무한루프에 빠지지 됩니다.

while(1)
{
    printf("d");
}

위에 while문은 조건 부분이 항상 1이므로 무한히 반복되며 d를 출력합니다. 멈추기 위해서는 Ctrl+c등 강제적인 수단을 써야 합니다. for문은 아래와 같이 하면 무한루프가 됩니다.

for(;;)
{
    printf("d");
}


6.3 break, continue, goto

위의 for와 while 같은 반복문 내에서 또는 단독으로 사용되는 continue와 break, goto에 대해서 알아 보겠습니다.

1.break

break가 실행되면 무조건 그 반복문은 그 시점에서 종료됩니다. break는 반복문에서 특정한 조건을 만나면 반복을 중지해야 할 경우에 사용됩니다.

for(i = 0; i < 10; i++)
{
    if(i == 5)
        break;
    printf("%d\n", i);
}

이전 소스코드에서 위와 같이 break;문이 있으면 (i == 5)일 경우가 되면 if문 내의 break가 실행되면서 그 순간 for문은 종료됩니다. 소스를 위와 같이 수정하고 실행 시켜면 프로그램은 0~4까지만 출력하고 종료 됩니다.


2. continue

break가 무조건 반복을 종료한다면, continue는 continue 다음의 코드를 실행하지 않고 반복은 계속 됩니다. 아래의 소스를 보겠습니다.

for(i = 0; i < 10; i++)
{
    if(i == 5)
        continue;
    printf("%d\n", i);
}

(i == 5)일 경우에는 if문내의 continue가 실행되며, continue 아래의 모든 코드는 실행되지 않고 건너 뛰게 됩니다. 그런 후 i는 6으로 증가 되어 이 후로는 for문의 조건을 만족하는 동안 코드는 반복됩니다.

위의 코드는 프로그램을 실행시키면 5를 제외한 0, 1, 2, 3, 4, 6, 7, 8, 9를 출력합니다.


3. goto

goto문은 위의 break와 continue와는 다르게, 반복문 이외에도 자유롭게 사용할 수 있습니다. 아래는 goto문의 사용법입니다.

goto [LABEL];

[LABEL]:

실행 시 위의 goto를 만나게 되면, 무조건 해당 [LABEL]이 있는 곳으로 건너 뛰어, 그 이후로 부터 실행 됩니다. [LABEL] 의 선언은 C의 일반적인 선언과 틀리게 마지막에 ":"을 사용하는 것에 유의하셔야 합니다.
 
while(i < 10)
{
    if(i == 7)
        goto END;
    
    printf("%d\n", i++);
}

printf("while end");

END:

위의 소스는 i가 7이되면 중간의 모든 명령을 건너뛰고 해당 레벨인 END로 가게됩니다. 이런 무지막지성(?) 때문에 소스에 혼란을 줄 수 있고, 예측할 수 없는 상황을 야기할 수도 있기 때문에 대부분 goto를 사용하지 말것을 권합니다.

하지만 아주 간혹(정말 간혹 입니다.) goto는 쓸데없이 많은 조건문(if 등)을 생략할 수 있게 해주고, 오히려 더 의미를 명확하게 해줄 경우가 있습니다.

그렇지만 당분간은 없는 명령어로 생각하시는 것이 좋습니다.

'프로그래밍 강좌 > C 언어 기초' 카테고리의 다른 글

8. 포인터 (pointer)  (4) 2007.06.16
7. C 함수 (function)  (4) 2007.06.15
5. 연산자  (0) 2007.06.13
4. 변수  (2) 2007.06.12
3. C 기초문법  (0) 2007.06.05
AND