본문 바로가기

카테고리 없음

[C언어 강좌] 반복문 -미완-


이번강좌에서는 반복문에 대해서 알아볼탠데요. 반복문을 사용하면 단순히 반복되는 코드를 단축시켜서 표현할 수 있습니다. 반복문이 들어간 코드는 가독성이 올라가게 되고, 소스파일의 용량도 줄어드는 장점이 있습니다.



이번 강좌에서 배울 내용


반복문이 탄생하게 된 이유

다양한 반복문 (for , while , do while)

반복문을 탈출하는 방법들


반복문의 필요성 느끼기


1부터 10까지 더하는 코드를 작성하려고 합니다. 코드를 어떤 식으로 짜야 할까요? 첫 번째로 나열하는 방법이 있겠네요.



/*plus.c*/


#include <stdio.h>


int main( )

{

int i = 1;

int sum = 0;                            // 더한 값을 저장할 변수


sum = sum + i;                        // sum과 i를 더하고 sum에 저장한다


i = i + 1;                                // i의 값을 1 증가시킨다.


sum = sum + i;


i = i + 1;


. . . .

. . . .                                      //중간 생략

. . . .


return 0;

}


sum변수에 1부터 10까지 더하는 단순한 코드를 짰습니다. 딱봐도 헛수고라는 느낌이 드네요.

10까지 더하는게 아니라 100까지 더한다고 하면 어떻게 하실껀가요? 100번 더하는 것을 나열하려고 하니 한숨부터 나옵니다. 이럴 때에 반복문을 사용한다면 굉장히 코드가 깔끔해집니다.

아래 예시에서는 for문이라는 반복문을 사용하여 1부터 10까지 더하는 프로그램을 구현하였습니다.


/* hello.c */


int main( )

{

int sum = 0;                            //더한 값을 저장할 변수


for(int i = 1; i <= 10; i++)        //i를 선언하고, i가 10이 될때까지 반복문을 실행한다. 

{

sum = sum + i;                

}                                          //블록이 끝났지만 반복조건이 만족되면, 블록을 다시 실행한다.


return 0;

}


코드량이 많이 줄어들었죠? 만약 100까지 더하는 코드와 비교한다면, 그 차이는 더 컸을 것입니다.

CPU는 반복문을 쓰던, 단순 나열하던 같은 양의 연산을 진행합니다. 하지만 명령어를 작성하는 프로그래머 입장에선 연산횟수만큼 코드를 작성하는게 쉬운일이 아니고, 어찌어찌 작성했다 하더라도 나중에 코드를 봤을 때 몇번을 적어놨는지 알기 힘들 것입니다.


반복문의 필요성을 여러분이 조금이나마 느꼈으리라 생각합니다. 그럼 반복문을 작성하는 방법과 반복문이 작동하는 원리에 대해 하나하나 알아보도록 합시다. 밑으로 가기전에 한 문장만 기억하고 갑시다.  


"반복문의 핵심은 탈출조건이다 "


복잡하지만 가장 편한 반복문, for문 


반복문은 크게 2종류가 있습니다. 그중에서 제일 잘쓰이는 for문부터 알아보도록 하겠습니다.

for문은 정말 자주사용되는 반복문입니다. for문이 다른 반복문보다 복잡하다고 생각하시는 분들도 있을거라 생각합니다.

왜 그렇게 느끼는걸까요? 문법에서 요구하는 식이 꽤나 많기 때문일겁니다. 아래가 for문의 문법입니다.


for(초기식 ; 조건식 ; 증감식)

{

반복할 내용

}


for문을 작성할때는 저 틀을 꼭 지켜주셔야합니다. 예외적인 표현방법이 있긴하지만, 저게 일단은 기본입니다.

앞에 for을 적은 후에 괄호를 열어서 그 안에 초기식,조건식,증감식을 작성한후, 블록을 생성해서 반복할 명령어를 적으면 끝입니다.

초기식,조건식,증감식에는 어떠한 것들이 들어갈수 있는지 알아봅시다.


-초기식

변수를 초기화하는 구간입니다. 반복문이 실행할때 맨처음으로 딱 1번만 실행되는 식입니다.

이곳에서는 for문의 블록에서 사용될 변수를 선언할 수도 있구요. 이미 존재하는 변수의 값을 변경할 수도 있습니다.

초기식의 예로는 int i = 0; j = 0; 이런 것들이 있겠네요.


-조건식

가장 중요한 식입니다. 반복문이 돌아가기 바로 직전에 for문은 이 조건식을 검사합니다. 조건식이 참이면 for문의 블록을 실행하고, 조건식이 거짓이라면 그냥 넘어갑니다. 조건문은 반복할때마다 검사가 시행되기때문에, 탈출조건으로써 사용됩니다

조건식의 예로는 i < 10 ; i != 10; 이런식의 참,거짓이 나뉘는 식들입니다.


-증감식

이곳은 반복이 일어날때마다 원하는 변수의 증가 혹은 감소를 시켜주는 곳입니다. 반복이 5번 일어났다면 증감식은 5번 실행이 되겠죠?

증감식의 예로는 i++, ++i , i-- , --i 가 있습니다.


for문의 진행 순서는 정말 중요합니다. 이것은 꼭 알아두셔야 합니다.


for문의 실행 순서

초기식 -> (조건식 -> 블록실행 -> 증감식) ->(조건식 -> 블록실행 -> 증감식) -> (조건식 -> 블록실행 -> 증감식)


제가 조건식이 가장 중요한 식이라고 했었죠? 조건식이 만족을하면 블록실행과 증감식은 무조건 실행이 됩니다.

조건식이 만족하지 않으면 그 순간 for문은 종료되고 맙니다.

바로 이 조건식이 for문의 탈출조건이 되는겁니다 ! 다시 말하겠습니다. 반복문의 핵심은 탈출조건입니다.


이제 어느정도 개념적인 설명은 다한것같네요. 실제로 예제코드를 보면서 for문이 어떤방식으로 진행되는지 알아보겠습니다.


/* hello.c */


int main( )

{

int sum = 0;                            //더한 값을 저장할 변수


for(int i = 1; i <= 10; i++)        //i를 선언하고, i가 10이 될때까지 반복문을 실행한다. 

{

sum = sum + i;                

}                                          //블록이 끝났지만 반복조건이 만족되면, 블록을 다시 실행한다.


return 0;

}


맨 처음에 사용했던 예제를 그대로 가져왔습니다.  자 for문이 어떤식으로 진행되는지 한번 볼까요?


for(int i = 1; i<=10; i++)


초기식 int i = 1;

조건식 i <= 10;

증감식 i++                    //i = i+1; 과 같은 코드


초기식에서는 int형 변수 i를 선언하고 1로 초기화하고 있네요. for문 실행시 초기식은 단 1번 사용되는 것 기억하시죠? ^^


for(int i =1; i<= 10; i++)


조건식 i<= 10;


조건식에는 i<= 10; 이 써있네요. i가 10이하일경우에는 참인 조건이 되고,반복문이 실행이 되겠죠? 이 조건식을 보면서 반복문이 실행되면서 i의 값이 커질거라고 감히 예상할 수 있겠네요 !


for(int i =1; i<=10; i++)                    //증감식 뒤에는 세미콜론 ;를 붙이지 않는다. 약속이다.


증감식 i++


증감식에는 i의 값을 1증가시키는 식이 쓰였네요. 반복을 할때마다 i의 값은 점점 커지겠구나 라고 예상할 수 있습니다.

다른 식들은 뒤에 세미콜론을 붙였는데, 증감식은 안붙였습니다. 이건 문법이니까 암기하셔야 하는부분입니다. ^^;;


{

sum = sum + i;

}


실행블록


우리가 반복시킬 블록입니다. sum과 i를 합쳐서 sum에 다시 대입하고 있습니다. 이곳에 반복시킬 여러분이 원하는 명령어를 적으면 됩니다.


어떤가요? 이제 어느정도 for문에 감이 오시나요? 사실 지금은 for문의 핵심 개념만 설명하고 있습니다.

for문은 이보다 더 설명할게 많이 남아있습니다. 활용방법부터 중첩for문등등... 그러나 기본이 제일 중요합니다.

위에서 설명한 for문의 기본문법은 for문의 어려운 활용에서도 그대로 쓰입니다. 그러므로 문법은 확실히 하고 가셔야되요!




순수한 반복문 while문


문법이 굉장히 간단한 반복문인 while문에 대해 알아봅시다. 문법이 간단하기때문에 공부하기는 쉽지만, 사실 for문이 더 많이 쓰입니다. 왜그런지 차근차근 설명해보도록 하겠습니다. 일단은 while문의 문법입니다.


while(조건식)

{

반복할 내용

}


while문도 마찬가지로 블록을 갖습니다. 블록 내부에는 반복할 내용을 작성하시면 됩니다.

for문을 이해했다면 while문의 실행순서도 예상이 가시겠죠? 조건식이 참이면 블록이 실행됩니다.


(조건식 -> 블록실행) ->(조건식 ->블록실행) . . . . . . . . . 조건식이 거짓이 될때까지..


이번에도 중요한 것은 조건식이 거짓이 될때인 탈출조건입니다. while문의 문법에서는 탈출조건을 따로 정해놓지 않아서 블록 내부에 직접 탈출조건을 만들어 놓아야 합니다. 이런식으로 말이죠.


int i = 1;


while( i <= 10)

{

i++;

}


while문은 초기식이 없기때문에 외부에서 선언한 변수를 사용하셔야 합니다. 보시면 while문의 블록 내부에 i의 값을 증가시키는 식이 있네요. 변수 i의 값이 점점 커지고 i의 값이 11이 되는순간, 조건식이 거짓이 되어서 while문은 종료가 됩니다.


제가 작성한 while문은 정말 간단하기 때문에 for문보다 쉬울수 있습니다만, 우리가 실제로 코드를 작성하다보면 while문 내부에 많은 코드들이 작성될 것입니다. 그 코드들중에서 어떤것이 탈출조건인지 찾기란 꽤 힘듭니다. 그렇기에 조금 복잡해질만한 내용은 for문으로 반복하고, 간단한 내용은 while문으로 반복하시는게 좋습니다.


특정한 상황에 쓰이는 반복문 do~ while문


이번에는 do ~while문에 대해 간단하게 얘기해보도록 하겠습니다. 이름만 봐도 while문과 비슷할 것 같죠?

실제로 while문과 do ~while문의 차이는 한가지밖에 없습니다. 그 차이점 하나가 do라는 단어를 붙이는 이유를 알려줍니다.


설명을 위해 간단한 가정을 하고 들어갑시다.


int x = 10;


while(x<=5)

{

printf("hello world!");

}


do

{

printf("hello world!");

}while(x<=5);


위에는 while문을, 아래에는 do~while문을 작성했습니다. 그리고 조건식에서 검사할 변수 x는 값이 10이 대입되있습니다.

코드가 실행이 된 후에 while문을 만나면 조건식을 검사합니다. x가 5이하인지아닌지 검사를 하겠네요. x의 값은 10이니까 조건식은 거짓이 됩니다. 따라서 while문은 실행이 되지않고 넘어갑니다.

이번엔 do~while문을 만나게 됩니다. 이상하게도 do~while문은 바로 조건식을 검사하지 않습니다.

일단 블록을 실행시킵니다. 그리고 조건식을 검사합니다. 차이점이 느껴지시나요? while문과 do~while문의 차이점은 바로 여기에 있습니다. 조건식을 검사하는 시기입니다.


while문은 먼저 조건식을 검사하는 반면에, do~while문은 블록을 실행한 후에 조건식을 검사합니다.

더 간단하게 차이점을 얘기하자면, do~while문은 조건식이 참이던 아니던 적어도 1번은 블록을 실행합니다.


do~while문은 자주쓰이지는 않습니다. 굳이 쓰지 않아도 while문이나 for문으로 대체가 가능하거든요. 그러나 정말 특별한 경우에는 사용합니다. 반복문이지만 꼭 1번은 실행시켜야되는 경우가 그 특별한 경우지요. 언젠가 여러분들이 프로그램을 만들다보면 그런 경우가 한번쯤은 오지않을까요? ^^



반복문과 그에대한 문법에 대해서 다뤄보았습니다. 사실 제가 설명한 문법 외에도 예외적인 문법이 많습니다만, 처음부터 그것을 가르치는 것은 좋지 않다고 생각하였습니다. 일단은 전통적인(?) 문법을 확실하게 알아둔 후에 예외적인 문법을 알아가는것이 더 학습효과가 좋을 것이라고 생각합니다.

어때요 할만한가요? 나중에 이 반복문을 가지고 어려운 논리구조를 만들어 낼수도 있습니다. 하지만 그것은 반복문 자체가 복잡한게 아니라, 수학적으로 복잡하게 반복문을 실행시키는 것뿐입니다.

그 복잡함도 결국엔 반복문의 문법자체에 기반을 두고있으니, 문법자체의 논리에 대해 확실하게 이해를 해두신다면 추후에 어려운 코드를 만나도 읽어낼 수 있을 것입니다.



for문의 실행순서를 알자.

for문의 초기식,조건식,증감식을 이해하자.

while문의 실행순서를 알자.

do~while문의 실행순서와 while문과의 차이점을 알자.

반복문에서 탈출조건은 굉장히 중요하다.