참고자료

아두이노, 오렌지보드 등의 오픈소스하드웨어를 사용하는데 필요한 것들을 알아봅니다.

제어문-반복 (for)

2014-08-04 09:47:25

for 반복문 (for loop)

 

for loop(이하 for문)은 if문과 더불어 기본 프로그래밍에서 쓰이는 기초적인 문법중 하나로 if문과 함께 상당히 많이 쓰이는 문법중 하나이다. 

for문의 역할은 while과 함께 조건에 따라 주어진 블록안의 구문을 반복실행하는 반복실행문으로 조건만 잘 설정하여 준다면 소스코드를 상당량 줄일 수 있게 도와주는 문법이다.

while문과의 다른점은 for문은 반복횟수가 일정량 정해져 있을 경우 사용되고 while문은 반복의 횟수가 아닌 조건에 따른 반복문을 써야할때 사용된다.

기본적인 for문의 구조는 다음과 같다.

 

for(초기화식; 조건식; 증가식;) {
   ......
}

 

위와같은 구조가 for문의 기본적인 구조이다.

초기화식에는 조건식에 참조될 변수의 초기값을 지정한 식이 들어간다. 예를 들면 int a = 0, int b = 1 이런식이 들어가는 셈이다. 초기화식은 for문이 실행될때 딱 한번 수행되는 문장이다.
조건식에는 for문을 수행할 것인지 아닌지를 결정하는 부분이다. 예를들면 초기화식에 int a = 0;을 선언했다면 조건식에는 a < 10; 이런식이 들어갈 수 있다.
이런 경우에는 a가 10보다 커지지 않는 이상 for문은 계속 반복해서 실행된다. 
증가식에는 초기화된 변수를 증가시키거나 감소시키는 식이 들어가는 자리이다. a++, a-- 이런식이 들어가는곳이다. 초기화변수의 값이 변화를 주어 매 loop마다 조건이 참인지 거짓인지 결정하여 반복실행할지 안할지를 결정하게 된다.

for문을 이용하여 다음과 같은 식을 생성할 수 있다. 

 

for(int i = 0; i < 10; i++) {
   Serial.println(i);
}

 

위 식을 실행시켰을 경우 시리얼모니터에는 0부터 9까지의 숫자가 차례대로 찍힐 것이다. 초기화된 변수는 0이고 10이 되기위해서는 for문을 10번 돌아야하므로 for문은 10번 실행될 것이고 그 가운데서 변수 i는 0부터 9까지 증가하면서 시리얼모니터에 Print되는 구조이다.

 

 

Array

 

array는 동일한 타입의 자료구조를 여러번 선언할때 사용된다. if문이나 for문같은 구문은 아니고 선언의 방식이라고 보면 된다. array를 사용하면 여러개 선언해야할 변수들을 한줄로 끝낼 수도 있으며 숙달되면 2차원 3차원배열까지도 생성이 가능하다. 

기본적인 구조는 다음과 같다.

 

데이터형 배열이름 [배열개수];

 

위와같은 구조가 일반적인 배열선언 구조이다. 데이터형에는 int char long과같은 데이터형이 올 수 있으며 배열 이름에는 말 그대로 선언할 배열의 이름을 적고 배열의 개수에는 몇 개의 배열을 생성할 것인지 적으면 된다.

 

int arr[3];

 

위와같이 배열을 선언했을 경우에는 int형의 변수를 연속해서 메모리를 잡아 생성한다. arr[0] arr[1] arr[2]
주의해야 할 점은 배열의 처음은 항상 0부터 시작한다는 점이다. 따라서 배열의 마지막은 [개수-1]이 된다는점을 유의하자.

 

int arr[5] = {0,1,2,3,4}

 

위와 같이 배열 선언시에 동시에 값도 지정이 가능하다.
위와 같은 경우에는 arr[0] = 0, arr[1] = 1, arr[2] = 2, arr[3] = 3, arr[4] = 4 이렇게 값이 설정된다.

 

For loop와 Array를 사용하여 지정한 순서대로 LED를 켰다 껏다하는 회로도를 구성해보자.

 

 

 

 

부품 목록

 

NO 부품명 수량
1 아두이노 보드 1개
2 220Ω 저항 6개
3 LED 6개
4 Hook-up  
5 브레드보드 1개

 

부품명 아두이노 보드 220Ω 저항 LED Hook-up wire 브레드 보드
부품 사진
 

 

 

 

 

하드웨어 making

 

브레드보드

 

전자 회로도


 

 

소프트웨어 coding

/*
 제목		: 제어문 / for
 내용		: for 문에 대해서 알아봅시다. 
 */
 
// 발췌 : http://www.arduino.cc/en/Tutorial/Array

//LED를 키고 끄는 중간의 지연시간을 변수로 선언해줍니다.
int timer = 100;           
// ledPins[]배열 안에는 핀번호가 들어가 있습니다. 
int ledPins[] = {2, 7, 4, 6, 5, 3}; 
// 배열의 크기를 나타내는 변수를 선언해줍니다. 
int pinCount = 6;                 


// 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
void setup() {
	//ledPins배열의 인덱스0번부터 5번까지의 핀을 출력 핀으로 설정
	for (int thisPin = 0 ; thisPin < pinCount ; thisPin++)  {
		pinMode(ledPins[thisPin], OUTPUT);      
	}
}


// setup() 함수가 호출된 이후, loop() 함수가 호출되며,
// 블록 안의 코드를 무한히 반복 실행합니다.
void loop() {
	// for문을 통해서 ledPins[]의 0부터 5번까지의 핀을 깜빡거립니다.
	for (int thisPin = 0 ; thisPin < pinCount ; thisPin++) { 
		// LED를 점등합니다.
		digitalWrite(ledPins[thisPin], HIGH);
		// 0.1초 동안 대기합니다.
		delay(timer);                  
		// LED를 소등합니다.
		digitalWrite(ledPins[thisPin], LOW);    
	}
	// 반대로 ledPins[]의 5번부터 0번까지의 핀을 깜빡거립니다.
	for (int thisPin = pinCount - 1 ; thisPin >= 0 ; thisPin--) { 
		// LED를 점등합니다.
		digitalWrite(ledPins[thisPin], HIGH);
		// 0.1초 동안 대기합니다.
		delay(timer);
		// LED를 소등합니다.
		digitalWrite(ledPins[thisPin], LOW);
	}
}

 

 

소스코드를 설명하면 배열을 사용하여 배열에는 LED의 핀번호를 삽입하여 선언하였다.
순서는 소스코드에 적혀있는 대로 2,7,4,6,5,3순으로 선언하였고
따라서 ledPins[]배열에는 ledPins[0] = 2, ledPins[1] = 7, ledPins[2] = 4, ledPins[3] = 6, ledPins[4] = 5, ledPins[5] = 3가 들어가게된다.
for문을 통해 증가하고 감소는 thisPin이란 변수의 숫자는 결국 핀번호와는 관계없고 ledPins배열의 인덱스를 나타내는 값이 된다.
thisPin이 1일 경우에는 ledPins[1] = 7이므로 7번핀을 나타내고 thisPin이 4일 경우에는 ledPins[4] = 5이므로 5번핀을 나타낸다.

loop문에서는 for문을 사용하여 LED를 키고 끄게 되는데 for문을 사용하여 배열을 증가시키고 감소시킨다.
첫 번째 for문에는 변수 thisPin을 증가시키며 배열 순대로 LED를 켰다가 끄게 되고(2번핀에 연결된 LED가 켜지고 timer가 지난 후 LED는 꺼지고 그 다음에는 7번핀에 연결된 LED가 켜지고 진행) 두 번째 for문에서는 반대로 thisPin을 5부터 감소시키며 배열의 역순으로 LED를 켰다가 끄게된다. (첫 번째와 반대로 3번핀 LED가 켜지고 timer가 지난뒤 꺼지고 그다음 5번핀의 LED순으로 진행)

 

 

 

 

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

반복문, for, 기타

바나나씨앗 2019-03-16 11:17:48

int ledPins[] = {2, 7, 4, 6, 5, 3};
를 2,3,4,5,6,7 로 바꾸면 좋더 좋을거 같네요 ㅎ