본문으로 바로가기

아두이노 기초 10. 제어문(1)

category 아두이노/기초 개념 2016. 11. 8. 04:21



제어문


C/C++ 프로그램은 보통 위에서 아래로 물 흐르듯 순차적으로 실행된다. 이 때 프로그램의 흐름을 조건에 따라 수행하거나 수행하지 않도록 할 수 있고, 원하는 블록을 반복시킬수도 있다. 이렇게 프로그램의 흐름을 조건에 따라 변경하거나 반복하는 명령문을 제어문이라 한다.


제어문의 종류


조건문 : if - else문, 다중 if - else문, switch - case문

반복문 : for문, while문, do - while문

기타 제어문 : break문, continue문, goto문, return문


조건문


프로그램 실행 중에 조건(참, 거짓)에 따라 프로그램의 흐름을 제어하는 명령문으로 if - else문, 다중 if - else문, switch - case문등이 있다.


1. 간단한 if문

간단한 if문은 조건이 참이면 if(조건식) 중괄호{ } 사이에 있는 문장을 실행하고 다음 문장으로 넘어간다. 조건이 거짓이면 문장을 실행하지 않고 다음 문장으로 넘어간다. 문장이 한 개일경우 중괄호는 생략이 가능하다.


ex1) 조건이 참일 경우

조건이 참일 경우 if 중괄호 안에 있는 문장을 실행하고, 다음 문장을 실행한다. 즉, sw가 1이고, sw가 1과 같으냐 물어봤으니 조건은 참이다. 조건이 참이므로 led를 켠 후 ture led on!을 찍어주고, if안에 있는 문장이 모두 끝났으므로 그 다음 문장인 next sentence를 찍어준다.


ex2) 조건이 거짓일 경우

sw가 100이고 조건은 sw가 1이냐고 물어봤으니 조건은 거짓이다. 조건이 거짓이므로 if 내부에 있는 문장은 실행하지 않고 다음 문장인 print문(next sentence)을 실행한다.


2. if-else문

if-else문은 조건이 참이면 if(조건식) 중괄호{ } 사이에 있는 문장1을 실행하고 else에 있는 문장2는 실행하지 않고 바로 다음 문장으로 건너뛴다. 조건이 거짓이면 if(조건식)에 있는 문장1은 실행하지 않고, else 중괄호 { } 사이에 있는 문장2를 실행한 다음 다음 문장을 실행한다. 이 역시 문장이 한 개일경우 if, else 모두 중괄호는 생략 가능하다.


ex1) 조건이 참일 경우

sw가 1이고 조건은 sw가 1과 같으냐 물어봤으니 참이다. 조건이 참이므로 if안에 있는 문장을 실행하고, else에 있는 문장은 건너뛴 다음 print문(next sentence)을 실행한다.


ex2) 조건이 거짓일 경우

if-else문에서 조건이 거짓일 경우에는 else안에 있는 문장을 실행한다. 위 예제에서는 sw가 100이고 조건은 sw가 1과 같으냐 물어봤으니 거짓이다. 그러므로 if안에 문장은 실행하지 않고 else안에 있는 문장을 실행한다. 위와같이 실행할 문장이 한 개라면 중괄호를 생략할 수 있다.


3. 다중 if-else문

다중 if-else문은 if 조건이 참일 경우 if 내부에 있는 문장1을 실행한 후 다음 문장을 실행한다. if의 조건이 거짓이고, else if의 조건이 참일 경우 else if 내부에 있는 문장2를 실행한 후 다음 문장을 실행한다. if, else if 모두 거짓이면 else 내부에 있는 문장3을 실행하고 다음 문장을 실행한다.

◎ 다중 if-else문 Tip

if(조건){ }

else if(조건1) { }

else if(조건2) { } ...

else if(조건 n) { }

1. 위와같이 else if는 여러개를 사용할 수 있다.

2. 모두 거짓인 경우가 필요 없을 경우 간단한 if문과 같이 else는 생략 가능하다.

3. 마찬가지로 문장이 한 개일경우 중괄호는 생략이 가능하다.


ex1) if 조건이 참일 경우

다중 if-else문에서 if가 참인 경우이므로 if문 안에 문장만 실행한다. 나머지 else if와 else안에 내용은 건너뛰고 바로 다음 문장인 print문을 실행한 모습이다.


ex2) if가 거짓이고 else if가 참인경우

조건이 참인 else if문을 실행한다. 즉, sw가 2이므로 다른 조건들은 거짓이고 else if(sw == 2)에 있는 조건이 참이므로 else if(sw == 2)에 있는 문장을 실행한다.


ex3) 모두 거짓일 경우(참인 조건이 없는 경우)

모든 조건이 거짓이라면 if-else문과 같이 else안에 있는 문장들을 실행한다.


4. switch-case문

switch-case문은 switch에서 지정한 변수나 조건식에 해당하는 값을 case에서 값을 받아서 해당 문장을 실행하고 break를 만나 다음 문장으로 넘어간다. 조건에 해당하는 case가 없을 경우 default에 있는 문장을 실행한다. case를 처리하고 switch문을 빠져나오기 위해 break;를 적어줘야 한다. break를 적지 않을경우 조건에 해당하는 case부터 끝나는 default값까지 모든 문장이 실행되므로 원하는 작업이 아닐경우 반드시 break를 넣어주어야 한다. 간단한 if문과 같이 이외의 조건이 필요없다면 default는 생략이 가능하다.

주의할 점은 case 값:을 적을 시에는 세미콜론(;)이 아닌 콜론(:)을 적어야 한다.

(break;는 세미콜론(;)을 적는다.)


예제 참고사항) 변수 sw를 선언하여 조건을 비교한다. switch(sw){ ... }와 같이 작성 하였으므로, sw의 값에 따라서 case에 있는 문장들을 실행한다.

ex1) break가 있고 조건이 맞는 case가 있을경우.

sw의 값은 1이고 case 1:이 있으므로 case 1:내부에 있는 문장들을 실행한다. 그러므로 led1번의 불을 켜고, csae 1!!이란 단어를 찍어준다. 그 이후에는 break;를 만나 switch문을 벗어나게 된다. switch문을 벗어났으므로 그 다음 문장인 print문을 실행한다. 결과적으로 led1번을 켜고, 시리얼 모니터에는 case 1!! next sentence라는 단어가 찍히게 된다.


마찬가지로 sw의 값이 3이므로 case 3:안에 있는 문장을 실행하므로 led3번을 켜주고 시리얼 모니터에 case 3!!을 찍고, switch문을 벗어나 next sentence를 시리얼 모니터에 찍어준다.


ex1-1) 조건에 맞는 정수식이 없을 경우

현재 sw는 100이고 조건에 맞는 case가 없으므로 이외에 값을 따지는 default:안에 있는 문장을 실행한다. if-else문에 있는 else와 같은 역할을 한다고 생각하면 된다.


ex2) break가 없을 경우

sw가 1이므로 case 1:부터 조건이 맞게된다. ex1에서는 break;가 있었으므로 case 1:에 있는 문장만 실행하고 끝이 났지만 break;가 없을 경우 그 아래의 case들도 모두 실행된다. 즉, case 1:이 조건이 맞으므로 case 1:내부에 있는 문장들을 실행 후 case 2: case 3: default:에 있는 모든 문장을 실행하고 끝이 난다.


위와같이 sw가 3이므로 case 3:이 조건에 맞는다. 이번에는 case 3:부터 그 아래인 default:까지 실행된다. 결론적으로 break;가 없으면 조건에 맞는 case부터 default까지 모두 실행된다. 그러므로 상황에 맞게 break;를 넣어주거나 넣지 않거나 하면 된다. break를 넣어야 하는데 실수로 break를 넣지 않으면 원하는 값이 나오지 않을 수 있으니 switch문에 숙련된 사람이 아니라면, break문을 꼭 넣는 습관을 들이는 것이 좋겠다.


지금까지 조건문을 배우면서 눈치 챈 사람들도 있겠지만, 모든 switch문은 전부 if문으로 구현이 가능하다. 역으로는 가능할 수도 가능하지 않을 수도 있다. 조건문에 정답은 없으니 상황에 맞게 더 편한 조건문을 사용하면 된다. 가령 명확한 조건이라면 switch문이 유리하고, 범위나 다중조건을 쓸 때에는 if문이 유리하다. 개인적으로는 if문을 사랑하지만, (무거운)프로그램 측면에서는 switch문으로 구현할 수 있는건 switch문으로 구현하는 것이 속도면에서 더 빠를 수 있다. 


예제 회로도 및 코드


모든 예제는 아래 회로도로 실험이 가능하다.

<브레드보드 회로도>


<스케메틱 회로도>


예제 코드는 본문을 참고하면 되며, 보이지 않는 void setup()부분은 아래 코드를 참고하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
int led1=13;
int led2=10;
int led3=5;
int led4=3;
 
void setup(){
    Serial.begin(9600);
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    pinMode(led3, OUTPUT);
    pinMode(led4, OUTPUT);
}
cs