SW개발

[C# 기초강좌] 8. C# 제어문(조건문과 반복문)

박종명 2023. 11. 2. 08:29
728x90
이 글은 제가 과거에 운영했던 사이트인 http://dotnet.mkexdev.net 의 글을 옮겨온 것입니다. 원본 글은 2010년에 작성되었습니다.

그 전에 운영했었던 사이트(mkex.pe.kr)은 흔적도 없이 사라 졌습니다. 그속의 글들도 모두... 그래서 이 사이트도 사라지기 전에 옮기고 싶은 글을 조금씩 이 블로그로 이동시키려 합니다.
(원본글) http://dotnet.mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=5&ID=672

이 글은 닷넷 기초 지식을 전파하기 위해 2010경에 작성되었으며, 당시 윤성우의 프로그래밍 스터디그룹 네이버 카페에도 필진으로 참여하여 연재했던 글이기도 합니다. 현재 시점에서 조금 달라진 부분이 있을 수 있으나 기본 원리와 언어 기초에 해당하는 부분은 크게 변하지 않았을 것으로 생각하며 이런 부분들을 감안해서 봐 주시기 바랍니다.

 

제어문 4형제: if, switch, for, while”

 

안녕하세요. 박종명입니다. 닷넷 여덟 번째 강좌를 진행하도록 하겠습니다.

이번 강좌는 C# 언어의 제어문에 대해 알아보겠습니다.

제어문은 크게 특정 조건에 따라 실행을 분기하는 조건문과 반복 실행을 위한 반복문이 있습니다. 이러한 제어문 역시 자바와 거의 차이가 없기 때문에 간략히 살펴보고 넘어가겠습니다


 

기본적으로 프로그램 구문의 논리적 실행방향은 위에서 아래 즉 순차적으로 실행됩니다.

그러나 간혹 이러한 순차적인 진행에 개입해서 실행 방향을 나누거나 특정 구문을 반복 실행할 필요가 있습니다.
.. 간혹?.. 사실 간혹 이라는 표현은 맞지 않겠네요. 대부분의 프로그램에서 제어문은 거의 필수로 요구되고 아주 자주 사용됩니다. 다들 아시겠지만.

 

이렇게 문장의 논리적 흐름을 제어하는 것을 제어문이라 합니다.

제어문은 특정 조건에 따라 실행을 분기시키는 조건문과 반복 실행을 시키는 반복문이 있습니다.

 

조건문

인생도 선택의 연속이라 했습니다.
프로그램 역시 실행되고 죽기(?)전까지의 삶 동안 많은 선택을 요구 받습니다. 인생에 있어 선택은 삶을 방향을 바꿀 수 있는 계기가 될 수도 있습니다. 이렇듯 우리가 프로그램의 생명주기 동안 그의 인생을 제어할 수 있다는 것은 아마 창조자의 기쁨(?)이지 않나 싶습니다. 
부적절 한가요? 비유가? ㅎㅎ 그냥 떠들어 봤습니다 ~

 

1) if-else 구문

이렇듯 특정 조건에 의해 어떤 실행을 할 것인가 선택하는 것은 조건문에 의해 이루어 집니다

대표적인 조건문은 if 구문 입니다. if 문은 조건식의 참/거짓 여부에 따라 실행 문장을 선택합니다.

조건식은 true/false 를 반환하기만 하면 그 어떤 형태라도 가능합니다.

예를 들어 if(a==b), if(a > b), if(변수), if(함수) 형태를 들 수 있겠네요

 

기본적인 if 문은 아래와 같습니다

if(조건식){

             //조건식이 참일 경우 실행할 문장

}

else{

             //조건식이 거짓일 경우 실행할 문장

}

 

그러나 간혹 체크해야 할 조건이 두 개 이상을 경우가 있습니다. 이럴 경우 else if 구문을 이용합니다

If(조건식1){

             //조건식1이 참일 경우 실행할 문장

}

else if(조건식2){

             //조건식2가 참일 경우 실행할 문장

}

else{

             //그 밖의 경우 실행할 문장

}

 

2) switch 구문

switch 역시 조건문에 해당합니다. 다만 그 사용형태가 조금 다를 뿐입니다

switch 에 체크할 대상을 두고 case 를 통해 그 대상과의 일치 여부에 따라 실행 문장을 선택합니다

그리고 각각의 case 에는 switch를 빠져 나가는 break; 문이 들어가야 합니다. 또한 어떤 조건에도 해당하지 않을 경우 default 영역이 실행됩니다. 앞서 if 구문의 else 와 그 의미가 유사한 default 구문은 생략이 가능합니다

int caseSwitch = 1

switch(caseSwitch){

             case(1):

                           // caseSwitch  = 1 인 경우 실행할 문장

                           break;

             case(2):

                           // caseSwitch  = 2 인 경우 실행할 문장

                           break;

             default:

                           //어떤 case도 해당하지 않을 경우 실행할 문장

                           break;

}

 

 case 에서 다른 case로 이동하기

C#에서는 C++과 같이 한 case에서 다른 case (암시적으로) 이동하는 것이 불가능합니다.

다만 case에 실행할 문장이 없는 경우는 가능합니다. 아래 코드를 보시죠. 결과가 어떻게 될까요?

int condition = 1;

switch (condition){

     case 1:                                

     case 2:

         Console.WriteLine("1 또는 2 입니다");

         break;

      default:

          Console.WriteLine("NaN");

          break;

}

결과는 case 2 가 실행되어 콘솔에 “1또는 2입니다 가 찍힙니다.
이상하죠? condition 은 분명 1인데 case 2가 실행됩니다.
이것은 case 1이 실행문장을 생략하여 case 2로 넘어가도록 했기 때문입니다.

이렇게 특정 case을 무시하고 바로 아래 case로 이동하고 싶을 경우 이런 형태로 사용할 수 있습니다.
다만 이런 구문은 가독성 문제가 있어 개인적으로 권장하고 싶지 않습니다.

 


특정 case 완전 배제하기

간혹 특정 case를 완전히 배제하고 싶은 경우가 있습니다. 이때는 case 에 실행구문을 제거하고 break; 
사용할 수 있습니다

int condition = 1;

switch (condition){

        case 1:

            break;

        case 2:

            Console.WriteLine("조건2");

            break;

        default:

           Console.WriteLine("NaN");

           break;

}

결과는 아무것도 실행되지 않게 됩니다.
 case 1 default 에도 속하지 않도록 완전히 배제하고 싶은 값일 경우 이런 식으로 사용합니다.
역시나 권장하고 싶진 않네요

 

 

반복문

인생도 어찌 보면 매 일상의 반복입니다.(또 시작이네요.. 잡설 ^^;)

while(true)

             먹고,자고,,퇴근하고

 

한 때 인생은 무한루프라는 생각을 한 적이 있습니다. 지겨울 때가 있었죠……

그러나 나이가 들면 들수록 루프의 조건이 만료되어 가고 있음을 느끼며 점점 초조해 지기도 합니다 ㅎㅎㅎ

 

1) for 구문

대표적인 반복문입니다. 조건식이 참(true)일 동안 실행을 반복하게 됩니다

반복을 위한 초기 값과 증분값을 지정할 수 있습니다. for(초기값; 조건식;증분 값)

for (int i = 1; i <= 5; i++){

   Console.WriteLine(i);

}

for문의 모든 식은 선택적 요소입니다. 즉 생략 가능한데요. 아래와 같이 기술하면 무한루프가 됩니다

for(; ;)

 

 

foreach 구문

C#에서는 배열이나 컬렉션을 간단히 반복하기 위해 foreach 구문을 지원합니다

이 구문을 이용하면 for 문의 초기값이나 증가값 등을 명시하지 않고 배열의 수만큼 반복 실행됩니다

int[] numbers = { 4, 5, 6, 1, 2, 3, -2, -1, 0 };

foreach (int i in numbers){

   System.Console.WriteLine(i);

}

 

foreach 구문은 특히 다차원 배열을 반복할 때 편리합니다

아래 코드는 2차원 배열을 탐색하는데요. 중첩 for를 이용하는 것보다 편리합니다

int[,] numbers2D = new int[3, 2] { { 9, 99 }, { 3, 33 }, { 5, 55 } };

foreach (int i in numbers2D){

    System.Console.Write("{0} ", i);

}

 

2) while 구문

역시 유명한 반복 구문입니다. 마찬가지로 조건식이 참(true)일 동안 반복 실행합니다

while(조건식){

             //반복 실행 문장

}

 

do- while 구문

while 의 경우 조건식을 먼저 체크하기 때문에 안에 있는 실행문장이 한번도 실행되지 않을 수 있습니다

반면 do-while 구문을 이용하면 조건식이 블록의 마지막에 정의되기 때문에 안에 있는 문장에 무조건 1

이상은 실행되도록 합니다. 아래 코드는 조건식이 거짓이지만 한번은 실행됩니다

int i = 0;

do{

     Console.WriteLine(i);

     i++;

} while (i > 2);

 

 

break  continue

break 반복문을 강제로 빠져 나가고 싶을 경우 사용합니다

즉 반복을 위한 조건식이 여전히 참(true)임에도 강제로 빠져 나가고 싶을 경우입니다


그리고 switch 에서도 문을 종료하는데 사용합니다.

아래 코드는 i  5를 초과하기 전에 2일 경우 루프를 빠져 나가도록 합니다

for (int i = 1; i <= 5; i++){               

      Console.WriteLine(i);

      if (i == 2){

             break;

       }

}

 

continue는 반복문 안에 문장을 실행하다 말고 다음 반복으로 이동할 때 사용합니다

아래 코드는 i  2일 경우에는 아래 문장을 실행하지 않고 다음 반복 단계로 이동하도록 합니다

for (int i = 1; i <= 5; i++){                               

       if (i == 2){

           continue;

        }

        Console.WriteLine(i);

}

 

 

goto

goto는 말 그대로 지정한 위치로 점프하도록 하는 제어문입니다. 문이 goto를 만나면 바로 그 지점으로 실행을
옮깁니다 아래 코드는 goto가 없다면 순차적으로 1,2,3 순으로 실행되지만 중간에 goto문을 만나면 
2,3
무시하고 Found라고 정의된 goto 지점으로 점프하게 됩니다

 

Console.WriteLine("1");

goto Found;

Console.WriteLine("2");

Console.WriteLine("3");

 

Found:

   Console.WriteLine("GoTo");

 

이런 형태의 goto 문이 남발된다면 코드의 가독성은 상당히 떨어지게 됩니다.
즉 이해하기 힘든 코드가 되는 것이죠. 권장하지 않습니다

 

그러나 goto문이 유용할 경우가 있는데요.

중첩된 루프를 단 한방에 빠져나가고 싶을 경우 유용합니다

앞에서 살펴 본 break는 자신이 속한 루프만을 빠져나갈 수 있기 때문에 중첩이 많이 된 루프를 한번에 빠져나가기
위해서는 goto 문이 더 유용할 수 있습니다

 

그리고 switch구문과 함께 사용될 때 효과적입니다.

아래 코드는 case 2에서 condition 변수를 증가하여 case 1 로 다시 이동하도록 합니다

int condition = 2;

switch (condition){

    case 1:

       Console.WriteLine(condition);                   

       break;

    case 2:                   

       Console.WriteLine(condition);

       condition++;

       goto case 1;

    case 3:

       Console.WriteLine(condition);

       break;

    default:

       Console.WriteLine("NaN");

       break;

}

 

이상으로 C#의 기본적인 제어문에 대해 알아보았습니다.

간략히 정리하려고 했는데 생각보다 글이 길어졌네요.
기본 문법을 정리하면서 이러한 제어문을 설명하지 않을 수 없어 주제를 정해 봤구요.
자바와 유사하기에 복습한다는 기분으로 훑어 보면 될 것 같습니다

 

그럼 좋은 한 주 되세요~~