본문으로 바로가기

아두이노 기초 11. 제어문(2)

category 아두이노/기초 개념 2016. 11. 8. 17:56



반복문


같은 작업을 여러 번 반복할 때 사용하는 명령문으로 for문 while문 do-while문이 있다. 반복문은 반복 사이클이 어떤식으로 돌아가는지 이해할 수 있어야 한다.


1. for문


for문은 초기값, 조건식, 증감식을 통해 지정된 횟수만큼 반복하는 반복문이다. 초기, 반복, 탈출 조건을 한번에 표현할 수 있으므로 반복문의 대표적인  명령문이다. 초기값과 조건식 증감식은 각각 세미콜론(;)으로 구분한다. for문도 if문과 마찬가지로 문장이 한 줄일 경우 중괄호는 생략이 가능하다.

for문의 반복 사이클을 살펴보면,

1. 초기값을 정한다.

2. 조건을 따져본다. (참일 경우 3번으로 거짓일 경우 반복문을 종료하고 5번으로 이동한다.)

3. 조건이 참이라면 문장을 실행한다.

4. 증감식을 이용하여 초기값을 증가하거나 감소한 후 2번으로 다시 돌아간다.

5. 조건식이 거짓이 되면 반복문을 종료하고 다음 문장을 실행 한다.

위 사이클은 for문의 가장 기본적인 사이클 이므로 꼭 숙지하기 바란다.


ex) for문 1부터 10까지 더하기

for문을 이용하여 1부터 10까지 더하고 시리얼 모니터에 찍어 보았다. 1~10까지 더하는건 암산이나 손으로 계산이 가능하지만 1~만 혹은 1~3422등등 암산이나 손으로는 계산하기 힘든 작업들을 반복문을 이용하면 빠르게 구할 수 있다.

위 예제의 반복 사이클을 한번 살펴보면,

초기값 설정을 위한 변수 선언(선언과 동시에 초기화도 가능) i, 더한 값을 저장할 변수 선언 sum.

for문에서 초기값은 i=1로 설정, 조건식은 10보다 작거나 같을 때까지 i<=10, 증감식은 한 번에 1씩 증가 i++(i=i+1, i+=1과 같은 표현이다.)

1번 째 사이클에서 i는 1(초기값)이고 sum은 0이다. i는 10보다 작으므로 조건은 참이 된다. 조건이 참이므로 for문 안에 문장을 실행하면, print문을 이용해 i값을 찍어주고, sum += i는 sum = sum + i와 같은 뜻이므로 sum에는 1이 저장된다. 조건이 참이었으므로 증감식(i++)을 적용시켜 i를 2로 만든다.

2번 째 사이클에서 i는 2이고 sum은 1이다. 조건이 참이므로 문장을 실행시켜 i가 2임을 찍어주고 sum += i를 실행하면 sum은 3이된다. 조건이 참이었으므로 증감식(i++)을 실행하면 i는 3이 된다.

3번 째 사이클에서 i는 3이고 sum은 3이다. 조건이 참이므로 i가 3임을 찍어주고 sum에 더하면 sum은 6이 된다. 증감식을 실행하면 i는 4가 된다.

......

10번 째 사이클에서 i는 10이고 sum은 45이다. 조건이 10보다 작거나 같다였으므로 조건은 참이 된다. 조건이 참이므로 i가 10임을 찍어주고 sum에 더해주면 sum은 55가 된다. 조건이 참이었으므로 증감식을 실행하면 i는 11이 된다. 다시 for문으로 돌아가면 i가 11이므로 조건은 거짓이 된다. 그러므로 for문 내부에 있는 문장은 실행하지 않고 for문을 빠져나온다. 빠져나오고 다음 문장을 실행하면 sum과 after i를 print문으로 찍어준다.

최종적으로 i는 11이 되고, sum은 55가 된 것을 알 수 있다.


2. while문

while문은 조건식이 거짓이 될 때까지 반복되는 반복문이다. 조건식이 거짓이 되면 반복문을 빠져나간다. 조건식이 거짓이 되는 조건이 없으면 무한루프에 빠질 수 있으니 조건을 빠져나올 수 있도록 조건식의 종료조건을 꼭 넣어주어야 한다. while문도 중괄호를 생략할 수 있으나 거의 사용되지 않으므로 while문을 쓸 때에는 꼭 중괄호를 넣도록 하자.


ex) while문 1~10까지 더하기

while문으로 for문과 동일하게 1~10까지 더하는 프로그램을 구현해 보았다. 구현하는 방법은 여러가지이지만 for문을 이해하고 보면 훨씬 이해하기 쉽기 때문에 for문과 비슷하게 코딩을 하였으니 이해하기 더욱 수월할 것이다.

while문도 무한루프를 돌릴 것이 아니라면, 초기값 조건식 증감식이 있어야 한다. for문과 마찬가지로 초기값은 1, 조건식은 i가 10보다 작거나 같을 때까지, 증감식은 i++로 적어주었다. 여기서 코딩을 하는 위치가 중요한데 초기값은 반드시 while문 밖에 적어줘야하며 조건식은 while(조건식)으로 증감식은 while문 내부에 적어줘야 한다.

반복 사이클은 for문과 동일하기 때문에 생략하도록 하겠다. (직접 손으로 공책에 적어보면서 분석하는 것을 추천한다.)


3. do-while문

while문과 비슷하지만 do-while문은 우선 문장을 무조건 한번은 실행을 한 다음 조건식을 따진다. 즉, 조건이 거짓이라면 while문의 경우에는 문장을 한번도 실행을 하지 않지만, do-while문은 조건이 거짓이라 하더라도 문장을 한번은 실행한다는 차이가 있다. 


ex) while문과 do-while문 비교

초기값은 i가 1이고 조건식은 i가 2와 같으냐 물어봤으니 조건은 거짓이므로 while문은 실행하지 않는다. 그러므로 바로 while end라는 문장을 시리얼 모니터에 찍어준다.


do-while문으로 작성한 모습이다. while문과 같이 실행 해야할 문장은 Serial.println("false!!!");로 동일하다. i가 1이고 조건은 i가 2냐고 물어봤으므로 거짓이다. do-while문은 무조건 한번은 문장을 실행하기 때문에 참, 거짓 여부에 상관없이 결과값에 false!!가 찍히고 조건이 거짓이므로 do-while문을 빠져나오게 된다.


무한루프


무한루프는 말 그대로 프로그램을 강제로 종료하지 않는 이상 무한으로 반복하는 것을 말한다. 의도한 것이라면 상관없지만 의도치 않은 무한루프는 프로그램을 마비시킬 수 있으니 반복문을 사용할 때에는 항상 이 무한루프를 조심해야 한다. 이미 우리는 계속해서 반복하는 void loop()문을 통해 무한루프를 사용하고 있었다. 무한루프가 오류를 초래하기도 하지만 사용해야 할 상황이 있으므로 무한루프를 사용하는 방법을 짧게나마 소개한다.

1. for문을 이용한 무한루프

for( ; ; ){ }

초기값 조건식 증감식을 비우고 세미콜론만 2개를 찍어주면 된다.


2. while문을 이용한 무한루프

while(1){ }, while(true){ }

while(조건식)에서 조건식을 1이나 true로 넣으면 무한루프를 돌릴 수 있다.


3. do while문을 이용한 무한루프

do{ }while(1), do{ }while(true)

while문과 마찬가지로 조건식을 1이나 true로 하면 무한루프를 돌릴 수 있다.


기타 제어문


기타 제어문은 조건문이나 반복문을 사용할 때 도움을 주는 제어문이다.


1. break

switch문에서 썼던 break문으로 특정 블록을 빠져나올 때 사용하는 제어문이다. 반복문을 사용중에 특정 값에서 탈출해라! 할 때 break를 사용하면 된다. 


2. continue 

break문과 비슷하지만 계속이라는 의미로 반복문을 실행 중에 continue문을 만나면 continue문 아래의 문장은 실행하지 않고 반복한다. 예로들자면,

while(조건){

   문장1;

   if(특정 조건)

      continue;

   문장2;

}

while 조건내에서 반복을 하고 if문이 거짓이라면, 문장1과 문장2가 반복해서 실행된다. 이 때 if가 참일 경우 continue문을 실행하므로 문장2는 실행하지 않고 다시 반복을 시작한다.

break문은 블록을 탈출하지만, continue문은 블록은 빠져 나가지 않고 아래 문장을 실행하지 않는다는 점이 가장 큰 차이점이다.


3. goto

프로그램을 실행중에 지정한 레이블로 강제로 이동하기 위한 제어문이다. goto문을 사용하면 편리한 점도 있지만 논리적이지 않기 때문에 너무 남발해서 사용하면 프로그램을 이해하기가 어렵고, 프로그램이 꼬여버릴 수도 있다. 초보자들은 가급적 사용하지 말고 코딩이 숙련되고 필요한 시점이 올 때 사용하기 바란다.


4. return

return은 호출된 함수가 수행을 마치고 결과 값을 호출한 함수 쪽으로 반환하는 제어문 이다. return문은 함수부분에서 많이 나오므로 함수 강의부분에서 다루도록 한다.