아두이노를 위한 프로그래밍 기초 2 – 파일, 중괄호, 함수, 변수
이 문서는 아두이노 보드를 사용하기 위해 필요한 프로그래밍 기초 지식이 없는 분들을 위한 가이드 문서입니다. 따라서 이미 프로그래밍에 대한 경험이 있다면 이 강좌 시리즈는 넘어가셔도 좋습니다.
=============================================================
많은 분들께서 프로그래밍을 처음 접하기도 하거니와 배울려고 작심했다고 하더라도 프로그래밍 언어를 배우는 과정을 어렵게 느끼고 포기하는 경우가 많습니다. 자책하거나 걱정할 필요 없습니다. 그게 정상입니다.
중요한 것은 프로그래밍 언어를 배울 때 욕심을 부릴 필요가 없다는 점입니다. 우리는 생각하는 것을 만들기 위해 필요한 만큼만 알고 있으면 됩니다. 우리에게 프로그래밍 언어는 취미로 혹은 뭔가를 직접 만들어 보기 위해 사용되는 도구이지 목표가 아닙니다.
근래에는 초등학생도 아두이노를 이용해서 간단한 작품을 만들곤 합니다. 이게 가능한 것은 초등학생이 성인보다 지적 능력이 뛰어나거나 프로그래밍에 대한 기술, 이해가 뛰어나서가 아닙니다. 실제로 학생들은 프로그램 전체를 이해하는 것이 아니라 적절한 예제를 제공받고, 논리적인 흐름을 지도 받고, 그 중 어디를 수정하면 어떻게 변화하는지에 대해 이해하기 때문입니다.
즉, 중요한 것은 프로그래밍 언어에 자체보다도 자신에게 필요한 적절한 예제를 찾고, 그 프로그램의 논리적인 흐름에 대해 이해하는 것입니다. 우리는 프로그램의 흐름을 이해할 정도의 기본 지식만을 알고 있으면 됩니다. 이 강좌에서도 간단한 예제들과 이걸 이해할 수 있을 정도의 내용만을 다루겠습니다.
프로그래밍을 한다는 것은 작은(혹은 규모가 큰) 회사를 운영하기 위해 계획을 세우는 것과 유사합니다. 이 강좌에서는 회사를 운영하기 위해 필요한 것들과 실제 프로그래밍의 유사성을 바탕으로 설명을 하겠습니다.
1. 소스코드와 아두이노: 작은 회사를 운영하기 위한 계획과 창업센터
회사를 운영하기 위해서는 사무실, 각종 기자재, 업무를 진행할 인력 등등이 많은 자원이 필요할 겁니다. 이런 자원을 편리하게 공급해주기 위해 창업센터가 있다고 가정해보죠. 우리가 회사 운영에 대한 계획을 전달하면 창업센터가 모든걸 알아서 해주는 겁니다.
여기서 회사 운영 계획이란 프로그래밍 언어로 작성된 소스코드에 해당하고 창업센터는 아두이노에 해당합니다. 만약 PC에서 실행되는 프로그램을 만든다면 창업센터는 PC에 해당하겠죠.
아두이노 창업지원 센터는 일반적인 PC에 비해 무척 작아서 단 하나의 회사만을 지원합니다. 그리고 회사에서 일할 사람도 딱 한 명만 지원해줍니다. 바꿔말하면 아두이노에는 여러분이 작성한 하나의 프로그램만 실행되고, 작성한 계획대로 한 번에 하나의 작업만을 순서대로 실행합니다. 동시에 여러가지 일을 할 수가 없습니다. PC에서는 여러개의 프로그램이 동시에 실행되고 하나의 프로그램도 여러가지 일을 동시에 할 수 있습니다. 아두이노도 작은 컴퓨터이지만 PC와는 이런 차이점이 있습니다.
2. 파일과 중괄호: 사무실과 파티션
창업센터는 회사 운영을 위해 사무실을 제공해줍니다. 우리의 계획에 따라 하나의 사무실을 쓸 수도 있고, 여러개의 사무실을 사용할 수도 있습니다. 여기서 사무실이 파일에 해당합니다. 중요한 점은 하나의 사무실은 다른 사무실과는 구분된 공간이며, 사무실에 비치된 여러가지 리소스 들은 다른 사무실과 공유하지 않는 것이 기본이라는 점입니다. (사무실(=파일) 간의 공유를 위해서는 좀 특별한 방법을 사용합니다.)
사무실도 파티션 등을 이용해서 좀 더 작은 업무 단위로 구분해서 사용할 수 있겠죠? 프로그래밍을 할 때 두 개의 중괄호 ‘{‘, ‘}’가 이런 역할을 합니다. 파티션으로 구분된 공간에 비치된 집기들도 사무실(=파일)처럼 다른 파티션에서 사용할 수 없습니다. 파티션 구분없이 사무실 전체가 자유롭게 쓰려면 파티션(=중괄호) 바깥쪽 공유된 공간에 집기를 둬야 합니다.
3. 예제를 통해 보는 함수
여기서는 아두이노 개발환경이 설치되어 있는 상태라고 생각하겠습니다. 아두이노 개발환경을 실행하면 텍스트 에디터와 유사한 화면이 보이고 그 속은 텅 비어있을겁니다. 예제를 하나 불러와서 위에서 설명한 내용을 이해해보죠.
아두이노 개발환경에서 [파일 – 예제 – 01. Basics – Blink]를 선택합니다. 그럼 LED 깜빡이기 예제 소스가 에디터에 보일겁니다.
/* Blink Turns on an LED on for one second, then off for one second, repeatedly. This example code is in the public domain. */ // Pin 13 has an LED connected on most Arduino boards. // Pin 11 has the LED on Teensy 2.0 // Pin 6 has the LED on Teensy++ 2.0 // Pin 13 has the LED on Teensy 3.0 // give it a name: int led = 13; // the setup routine runs once when you press reset: void setup() { // initialize the digital pin as an output. pinMode(led, OUTPUT); } // the loop routine runs over and over again forever: void loop() { digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(led, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second }
Blink.ino 파일로 저장된 소스코드를 불러온 상태입니다. 이걸 컴파일하고 업로드하면 아두이노는 Blink 라는 사무실을 할당해서 운영을 하는거라 이해하셔도 됩니다. 이제 위 예제를 좀 더 자세히 보겠습니다.
[/*] ~ [*/] 표식으로 둘러싸인 부분과 [//] 이후부터 줄넘김 이전까지의 문자는 프로그램 실행과는 전혀 상관없이 단순히 우리의 계획서에 부가적인 설명을 해놓은 부분입니다. 주석이라고 하는데, 일단 이 부분은 제거하고 보면 아래와 같습니다.
int led = 13; void setup() { pinMode(led, OUTPUT); } void loop() { digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); }
여기에 중괄호로 둘러싸인 부분은 2군데가 있습니다. setup 이후에 나오는 블럭과 loop 이후에 나오는 블럭입니다. 이 두 블럭은 특정한 일을 하려고 파티션으로 미리 구분해 둔 공간입니다.
이렇게 중괄호와 함께 아래 형식으로 작성된 부분을 함수라고 부릅니다.
void setup() { … }
void loop() { … }
중국 음식점을 생각해보시면 홀, 주방, 카운터 이렇게 공간이 구분되잖아요? 그것과 비슷하게 하나의 기능을 한번에 쭉 처리할 수 있게 구분해 두고 이름을 달아둔 겁니다.
food kitchen( order ) { … }
중국 음식점의 주방은 주문을 넣으면 요리가 나오지요. 이걸 함수로 표현하면 위처럼 되는겁니다. 이걸 일반적인 형태로 표현하면 아래와 같습니다.
출력할데이터종류 함수이름( 입력할데이터종류 ) { 처리할 내용 }
4. 변수와 메모지
파일에 적힌 전체 소스코드 중 두 개의 함수 영역을 지워보세요. 그럼 아래 라인만 남습니다.
int led = 13;
결론부터 말하면 이걸 변수라고 부르고 메모지 같은 역할을 합니다.
만약 당신이 1부터 100까지 암산으로 더한다고 생각해보세요. 횟수가 더해갈수록 숫자가 복잡해지면서 기억이 가물거리고 뒤엉켜서 엉뚱한 결과가 나올겁니다. 이걸 방지하려면? 메모지에 적어가면서 해야죠. 변수가 그런 역할을 합니다. 회사 업무를 하려면 이런저런 정보들이 사람을 거쳐가는데 어딘가에 적어두지 않으면 나중에 필요할 때 기억나질 않습니다. 프로그래밍의 세계에서는 이걸 좀 철저하게 관리해야 합니다. 무엇을 기억할지를 미리 계획해서 메모지를 준비해 둬야 하죠.
int led = 13;
데이터종류 데이터이름 = 초기화할값;
이런 형태로 변수(=메모지)를 사용하겠다고 선언합니다. int는 정수를 말하는데 이외에도 char(문자 1개, 1바이트), float(실수), boolean(참과 거짓, on/off) 등이 자주 사용되는 데이터 종류입니다. 데이터 이름은 누가봐도 이해가 가능한 적당한 이름을 넣으면 되지만, 단 공백과 특수문자는 피하세요. 초기화 할 값은 처음에 메모해 둘 값입니다. 1부터 100까지 더한 결과를 기록할 변수(=메모지)라면 처음에 1을 넣어두면 되겠죠.
이제 위 라인이 무엇을 뜻하는지 대충 감이 오실 수도 있겠네요. 실제 위 라인은 아두이노에 내장된 LED를 제어할 수 있는 아두이노의 pin 번호를 변수에 메모해 둔 겁니다.
5. 전역변수와 지역변수
앞서서 중괄호로 둘러싸인 공간에서 사용되는 리소스는 다른 공간과 공유하지 않는다고 했습니다. 그런데 중국 음식점에서 주문을 받으면 주문내역은 홀과 주방, 카운터에서 모두 공유되어야 합니다. 이럴땐?
int led = 13;
전체 소스코드 중 위에 적혀있는 라인이 setup 블럭과 loop 블럭 바깥쪽에 위치해 있죠? 따라서 위 라인에 적어둔 리소스는 setup, loop 함수 모두에서 공유될 수 있는 리소스입니다. 중국 음식점의 주문내역 처럼요. 만약 위 라인이 setup이나 loop 함수의 중괄호 안에 들어가 버리면 이 리소스는 해당 함수 안에서만 사용 가능해집니다.
이렇게 파일(=사무실) 전체에서 사용가능한 변수를 전역변수라고 부르고, 중괄호(=파티션) 안에 배치된 변수를 지역변수라 부릅니다. 위 라인에 정의된 led 변수는 전역변수이고, 파일 내부 어디에서나 led 라는 이름으로 메모해 둔 값 13을 사용할 수 있습니다. 물론 이 값을 파일 내부 어디에서나 변경할 수도 있습니다. 아래처럼요.
led = 23;
다음 강좌에서 setup, loop 함수가 가진 특별한 기능과 아두이노에서 어떻게 위 소소코드가 동작하는지 살펴보겠습니다.
=============================================================
이 문서는 작성자의 동의없이 개인적인 목적 외의 상업적인 목적으로 활용되어서는 안됩니다.
이 문서의 일부 혹은 전체를 수정, 삭제, 재배포 하여서는 안됩니다.
작성자 : GodsTale (godstale@hotmail.com)