아두이노 반복문 while문 for문
반복 구조에 사용되는 while문과 for문 do ~ while문 그리고 예제 코드
에 대해 작성하였습니다.
반복문
반복문은 주어진 조건식을 만족하는 동안 코드를 반복 실행하기 위해 사용됩니다. 반복해서 실행하는 것을 루프라고 표현합니다. 아두이노에 void loop() 함수는 계속해서 반복되어 실행하는 함수입니다. 이와 유사하게 프로그래밍에서 특정 조건에 따라 코드를 반복 수행 하도록 해주는 제어문을 반복문이라고 합니다.
Arduino에서 제공하는 반복문은 while, do ~ while, for 문이 있습니다. 아래는 이 세 가지 반복문의 흐름도를 나타냅니다.
- while : 조건이 만족하는 경우 실행문A를 반복해서 실행
- do~while : 일단 실행문A를 한번 실행하고, 조건을 만족하는 경우 실행문A를 반복해서 실행
- for : 조건에 사용되는 변수가 지정된 증감식에 따라 조건식을 비교하여 참일 경우 실행문 A를 반복해서 실행
while
while문은 가장 간단한 사용법을 가지고 있는 반복문의 형태로, 입력된 조건이 true 일 동안 while 문의 실행코드를 반복해서 실행하고, 조건이 false 인 경우 while 문을 빠져 나옵니다. while문의 조건이 처음부터 false 인 경우 while문 내의 코드를 한번도 실행하지 않을 수 있습니다.
while문 구조
while문은 조건이 참일 경우 { } 내부의 코드가 동작합니다. 조건은 boolean 데이터 타입으로 변수, 반환 값이 있는 함수, 연산자 등이 올 수 있습니다.
1
2
3
|
while(조건){
// 조건이 참일 경우 수행
}
|
cs |
while() 문을 이용하여 영원이 빠져나오지 못하는 코드 입니다. 프로그램이 반복적으로 실행되는 것이 아니라, 1회만 특정한 기능을 수행하고, 하지 말아야 하는 경우 사용 할 수 있습니다. 실제로 쓰일 일은 없지만, 간단한 테스트용도로 사용하는 경우가 있습니다.
1
2
3
|
while(1){
// 영원히 돌아가는 함수
}
|
cs |
if 문과 break 명령을 이용하여 특정 조건일 때 while 문을 빠져 나오는 코드입니다.
1
2
3
4
5
6
7
8
9
|
while(조건){
// 조건이 참일 경우 수행 코드
if(세부조건){
// 세부조건 참일 경우 수행
break;
}
}
|
cs |
continue 명령을 이용해서 특정 조건일 때 continue 명령 이하 코드를 건너뛰고, 다음 루프로 진행하는 코드 입니다.
1
2
3
4
5
6
7
8
9
|
while(조건){
// 조건이 참일 경우 수행 코드
if(세부조건){
// 세부조건 참일 경우 수행
continue;
}
}
|
cs |
break 명령과 continue 명령을 이용해서 특정 조건에 따라 while 문을 빠져 나오거나, 그 다음 루프로 진행 할 수 있습니다. 아래 코드에서 '세부조건2'를 만족하는 경우 수행코드2는 건너 띄고, 다음 루프로 진행하여 수행코드1 부터 진행합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
while(조건){
// 조건이 참일 경우 수행코드1
if(세부조건){
// 세부조건1 참일 경우 수행할 코드
break; // 세부 조건이 참일 경우 while 문 빠져 나감
}
if(세부조건2){
// 세부조건2 참일 경우 수행 할 코드
continue;
// 세부조건2가 참일 경우 아래의 수행코드2를 패스하고 다음 루프로 진행
}
// 조건이 참일 경우 수행코드2
}
|
cs |
예제 : 시리얼 통신으로 카운트 출력
시리얼 통신으로 '1'이 입력되는 경우 0.5초 간격 카운트 시작
시리얼 통신으로 '0'이 입력되는 카운트 멈춤
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
int iUartRecvData;
int iCount = 0;
boolean flag;
void setup(){
Serial.begin(9600);
}
void loop(){
checkRxBuffer(); // 시리얼 통신 확인 함수 호출
// flag가 true 일 떄 중괄호의 코드를 실행
// flag 값은 시리얼로 0 수신시 false, 1 수신시 true
while(flag){
Serial.println(iCount);
delay(500);
iCount++;
checkRxBuffer(); // 시리얼 통신 확인 함수 호출
}
}
// 시리얼 수신된 데이터에 따라 flag 변경
// 1 수신시 true, 0 수신시 false
void checkRxBuffer(){
if(Serial.available()>0){
iUartRecvData = Serial.read();
if(iUartRecvData == '1'){
flag = true;
}
else if(iUartRecvData == '0')
{
iCount = 0;
flag = false;
}
}
}
|
cs |
checkRxBuffer(); 는 시리얼 수신 데이터가 1일 때 flag 를 true, 0일 떄 false 를 반환하는 함수입니다. 함수에 대한 설명은 추후 포스트에서 작성할 예정입니다. checkRxBuffer(); 코드가 수행되면 맨 아래의 void checkRxBuffer() { } 가 호출된다고 생각하시면 됩니다.
실행 화면은 아래와 같습니다.
do while문
do ~ while 과 while 문의 차이는 딱 하나입니다. do ~ while 은 중괄호 안의 코드를 무조건 한 번 반복한 후에 조건을 검사합니다. 대조적으로, while문은 중괄호 안의 코드를 수행하기 전에 조건을 검사합니다. 기본적인 do ~ while 문의 구조는 아래와 같습니다.
1
2
3
|
do {
// 수행코드
} while (조건);
|
cs |
for문
for문 구조
기본적인 for문의 구조입니다.
1
2
3
|
for(변수초기값 ; 조건 ; 증가치){
// 변수의 값이 조건을 만족하는 경우 수행
}
|
cs |
continue 명령을 이용하여 특정 조건에 다음 루프로 건너 뛸 수 있습니다. 다음 루프로 넘어 갈 경우 변수 증가치를 반영 합니다.
1
2
3
4
5
6
|
for(변수초기값 ; 조건 ; 증가치){
if(세부조건) {
continue;
}
// 변수의 값이 조건을 만족하는 경우 수행
}
|
cs |
break 명령을 이용하여 특정 조건에 for문을 빠져 나올 수 있습니다.
1
2
3
4
5
6
|
for(변수초기값 ; 조건 ; 증가치){
// 변수의 값이 조건을 만족하는 경우 수행
if(세부조건) {
break;
}
}
|
cs |
for문은 변수 초기값, 조건, 증가치의 영역이 정해져있지만, 생략이 가능합니다. 아래 코드는 증가치를 생략하고 증가치를 for 문 내에 작성한 코드입니다.
1
2
3
4
|
for(int i = 0 ; i < 10 ; ){
// 동작 코드
i = i + 1;
}
|
cs |
아래는 특정 조건일 때만 증가치를 적용 하는 코드 입니다.
1
2
3
4
5
6
|
for(int i = 0 ; i < 10 ; ){
// 동작 코드
if(조건){
i = i + 1; // 조건을 만족을 때 증가치 반영
}
}
|
cs |
아래는 for문을 while문 처럼 사용 하는 코드 입니다.
1
2
3
4
5
|
for(;;){
if(조건){
break;
}
}
|
cs |
예제 : for문으로 로또 번호 출력
0.5초 간격으로 로또 번호를 출력하는 예제 입니다.
📌 21/05/05 수정 : 아래 코드의 9번 줄을 추가하였습니다. random() 함수가 정상적으로 난수를 발생시키기 위해 randomSeed() 코드를 추가하였습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
byte iLottoNumber[6] = {0,0,0,0,0,0};
void setup(){
Serial.begin(9600);
Serial.println("Finish Serial Initialize..");
Serial.println("Program Start..");
Serial.println("");
randomSeed(analogRead(A0));
}
void loop(){
Serial.println("Lotto Number Collecting..");
// 로또 번호 6개 출력을 위해 6step 의 for문 실행
for(int i = 0 ; i < 6 ;){
boolean duplecateflag = false;
int temp = random(1, 45);
// 중복 값이 발행하는 경우 중복 발생을 알리고, for문 빠져 나옴
for(int j = 0; j < i; j++){
if(iLottoNumber[i] == temp){
duplecateflag = true;
break;
}
}
// 중복이 발생하지 않은 경우 추첨된 로또 번호를 출력
if(!duplecateflag){
duplecateflag = false;
iLottoNumber[i] = temp;
Serial.print(iLottoNumber[i]);
Serial.print(" ");
i++;
}
}
Serial.println("");
delay(500);
}
|
cs |
실행 결과는 아래와 같습니다.
while() for() 선택 가이드
언제 while()문을 쓰고 언제 for()문을 쓸지 정답은 없습니다. 하지만, 무엇을 선택해야 할지 고민하는 시간을 줄이기 위해 아래의 내용을 참고해주시면 감사하겠습니다. 사실 while()도 for()처럼 사용이 가능하고 for()도 while()처럼 사용이 가능합니다.
마무리
이전 3포스트 동안 프로그래밍 기초에 관련된 포스트를 진행하였습니다. 변수,데이터 타입을 알아보고, 제어문, 반복문 등의 제어 흐름 구조에 대해 알아보았습니다. 다음 포스트는 이 기초 프로그래밍 내용을 응용할 수 있도록 이전에 진행했던 Arduino Peripheral 와 관련된 내용을 이어서 포스트를 작성할 예정입니다.
끝까지 읽어주셔서 감사합니다.^^
'Embedded > Arduino' 카테고리의 다른 글
아두이노 강좌 #11 시리얼 UART 수신 인터럽트 serialEvent() (5) | 2020.07.10 |
---|---|
아두이노 강좌 #10 디지털핀 인터럽트 (EXTI, digitalPin Interrupt) (1) | 2020.07.09 |
아두이노 강좌 #8 프로그래밍 기초 - 조건문 if, switch ~ case (0) | 2020.07.07 |
아두이노 강좌 #7 프로그래밍 기초 - 데이터 타입, 변수, 상수, 선언자 (0) | 2020.07.06 |
아두이노 강좌 #6 시리얼 통신 3. UART 수신 프로그래밍 (1) | 2020.07.05 |