RedCrow + GreenBean

Feed Rss

아두이노 스케치 언어 – 기본함수와 구문

05.16.2012, arduino, by .

아두이노는 c문법의 형태를 따르고 있다.
물론 전혀 다른 함수, 전혀 다른 사용법을 가지고 있기도 하다.
하지만 보통의 프로그램 언어가 그러하듯이 기본적인 형태는 거의 비슷하다.
이미 Reference를 보면 자세히 잘 나와 있겠지만 가볍게 살펴보고 넘어가보도록 하겠다.

먼저 상수와 변수의 개념부터 살펴보자.

상수
이미 값이 정해져 있는 것이다.
보통 프로그램에서 이미 결정되어져 있는 값들을 나타낸다.
이 상수를 우리는 읽어들이는 용도로 많이 사용한다.

변수
이미 값이 정해져 있을 수도 있고 아닐수도 있고…
무엇보다도 우리가 그 값을 바꿀 수 있다.
값이 변한다 해서 변수 이다.

그리고 보통 수학기호 형태를 많이 사용하는데 엄밀히 말해서 수학기호 그대로 해석을 할 수 없다.

위 예제에서 기호 = 는 두 값이 같다는 뜻보다는 = 를 기준으로 오른쪽에 있는 계산식의 결과 혹은 값을 왼쪽에 있는 변수에 입력해라는 뜻이다.
결국 a라는 변수에 1이라는 값을 넣으라는 뜻이다.
다음의 예제를 더 보자.

이라고 헀을때…
처음에는 a변수에 1이라는 값을 넣으라 했고
두번째는 b라는 변수에 2라는 값을 넣으라 했다
그러면 세번째 b의 값은 어떻게 될까?
a변수의 값에 3을 더해서 b변수에 넣으라 했으니 a변수 값이 1이고 거기다 3을 더하니 b변수에는 4가 들어간다.
그러면 수학에서는 인정되지 않지만 프로그램 언어로는 해석이 되는 아래의 예제를 보자.

수학에서는 용납이 안되는 것이다.
하지만 앞서 말한것처럼 수학적 개념과 조금 다르다.
첫번째에서 a변수에 1을 넣으라 했다.
그러면 a변수에는 1의 값이 있다.
두번째에서는 우선 오른쪽의 계산식을 완료해서 값을 얻어낸다.
a변수에 1이라는 값이 있고 거기다가 2를 더해라 했으니 계산식의 결과는 3이 된다.
그러면 이 3이라는 값을 왼쪽의 a변수에 다시 넣는다.
결과적으로 a변수에는 3이라는 값이 들어있다.
수학과 같은 기호를 썼다고 해서 수학처럼 생각지 말고 조금 노력해보자.

Structure

setup()
반드시 스케치에 포함되어야 한다.
값을 미리 정하는 부분으로 아두이노 각 핀들의 입출력 상태를 정하거나 작동 시간등을 정한다.
이 setup() 함수는 최초 시작할때 한번만 실행된다.

loop()
마이크로프로세스는 종료 시점이 없다.
그저 전원이 없어지면 그게 종료이다.
그전까지는 무한반복해서 프로그램이 실행된다.
그러한 뜻에서 loop라는 함수명을 사용한듯 하다.
일반적으로 c언어에서는 main()이라고 사용된다.
이도 마찬가지로 반드시 스케치에 포함되어야 한다.

Further Syntax

; (semicolon)
항상 모든 문장의 끝은 ;로 끝을 낸다.
하나의 문장이 끝났음을 알리는 기호다.
{}의 뒤에는 붙이지 않는다.

{} (curly braces)
중괄호는 하나의 묶음으로 만들어 준다.
사용자함수의 묶음을 구분하기도 하고 제어함수의 범위를 지정하기도 한다.

// (single line comment)
주석을 만들때 사용한다.
주석이라 함은 직접적으로 프로그램에 영향을 주지 않는 문장을 말한다.
설명을 적는것이 보통이지만 때에 따라선 실행되지 않았으면 하는 문장들을 주석처리 할때도 있다.
//은 현재 한줄에 대해서만 주석처리를 하는 뜻으로 //이 나타난 이후 엔터가 나오기까지의 모든 내용을 주석처리 한다.

/* */ (multi line comment)
앞서 해당 한줄만 주석으로 만드는것에 이어 여러줄에 걸쳐 주석의 시작과 끝을 알린다.
/*으로 주석의 시작을 알리고 */가 나오기까지의 명령들은 모두 주석처리된다.

※ 주석의 경우는 아무리 많이 적는다 해도 컴파일시 기록되지 않음으로 결과파일의 용량에 영향을 미치지 않는다.
그저 스케치 파일의 용량에 영향을 미치지만 일반 텍스트 형태임으로 그리 많이 차지 하지는 않는다.
하지만 이 주석이야 말로 프로그램 능력을 키우는 최고의 방법이라 할 수 있겠다.
주석은 많이 작성하는게 좋다.
물론 아무런 말이나 마구잡이로 작성하는것이 아니라, 해당 내용이 무엇인지 자세히 설명하고 때에 따라선 문제시 됬던 부분을 해결하였을때 주석으로 그러한 내용을 입력해서 향후 동일한 문제 발생시 참고할 수 있다.
내가 만든 프로그램이지만 시간이 지나면 잊어버리고 나중에는 어떤 생각으로 이러한 코드를 만들어 냈는지 기억이 전혀 나질 않는다.
그럴때 이러한 주석으로 간략한 설명이라도 해놓았으면 쉽게 접근이 가능하다

#define
특정한 이름을 내가 알기쉬운 이름으로 바꾼다 라고 생각하면 된다.
아두이노를 제작하면서 3번 핀에 LED를 달았는데 자꾸 잊어버리게 된다.
LED가 3번핀에 연결되어 있다는 것을 어딘가에 적어 놓는다면 참 쉬울텐데 말이다.
그러한 문제를 #define이 해결한다.

위와 같이 해놓으면 그 밑으로 LEDPIN이라고 쓰여진 부분은 모두 3이 대신 들어간다라고 보면된다.
이러한 #define의 경우 혹시 프로그램을 다 짜놓고 LED를 3번핀에서 4번핀으로 옮겨야 하는 일이 발생하였다면, #define을 쓰지 않았다면 3번핀이라고 사용된 모든 부분을 일일이 찾아서 4번핀이라고 바꿔줘야 하는데, #define을 사용 했다라면 그저 #define에서 3을 4로만 바꾸면 된다.

#include
#include는 다른 파일을 불러올때 사용된다.
일반적으로 헤더파일을 부를때 사용된다.
모든 사용가능한 함수를 기본프로그램에 깔아 놓는다면 그 용량은 너무나도 커질것이다.
내가 쓰지도 않을 함수를 왜 준비해놓겠냐는 말이다.
그렇다보니 기본이 되는 함수를 제외한 특정 기능을 가진 함수들을 모아놓은 헤더파일은 내가 그러한 헤더파일을 필요로 할때만 #include를 통해서 불러온다.
물론 #include를 통해서 불러오지 않고 코드 내부에 해당 헤더파일을 다 넣어도 상관은 없다.
하지만 편리한 사용과 가독성을 높이기 위해 #include를 사용한다.

Control Structures

if
조건문이 참이면 if문 내의 명령을 실행하고 거짓이면 다음으로 넘어간다.

예제에서 a는 값이 1이라 했다.
if문의 조건문은 a가 0보다 크다면 이라고 물었다.
a가 1이기 때문에 0보다 크다.
그러므로 조건이 참이 되고 if문 내의 {}안의 작업을 실행할 수 있다.

예제에서 a는 값이 5라고 했다.
if문의 조건문은 a가 10보다 크다면 이라고 물었다.
a가 5이기 때문에 10보다 크지 않다.
그러므로 조건은 거짓이 되고 if문 내의 {}를 수행하지 않고 다음으로 넘어간다.

if … else
if문의 경우는 거짓을때 행해지는 작업이 없지만 if … else 문의 경우는 거짓일때 else 문 뒤의 작업을 수행한다.

이러한 if … else 문을 계속 연결해서 사용 가능하다.

for
초기값, 조건문, 변화값 의 세가지 값을 가지며
조건문이 참이 되는 동안에 for문 내의 프로그램을 실행한다.

초기값을 i=0으로 해서 i에 0의 값을 넣어 놓는다.
조건문은 i<10으로 초기값으로 i에 0이 들어갔으니 0<10은 참이다.
그러면 조건문이 참임으로 for문 내의 프로그램을 수행한다.
for문 내의 프로그램을 수행하고 나면 변화값을 바탕으로 값을 변화시킨다.
변화값은 i++로서 i의 값을 1증가 하라는 뜻이다.
그러면 i는 이제 0에서 1이 되었다.
다시 조건문으로 비교를 해보아도 i는 1이 되었음으로 i<10에 대해 참이된다.
그런식으로 해서 for문내의 프로그램을 특정횟수만큼 반복하고나서
i<10 조건에 맞지 않으면 for문은 종료가 된다.
특정 횟수만큼 반복했으면 할 때 사용한다.

switch case
switch라는 말처럼 특정 값에 맞게 스위치를 돌린다 라고 생각하면 된다.
if … else 문을 반복사용하는것과 비슷한 형태로 동작을 한다.

위와 같이 변수가 어떤 값을 가지냐에 따라 해당 값을 가지는 case문을 실행한다.
각 case문마다 break문이 걸려 있지만 때에 따라선 break문을 사용하지 않아도 된다.
break문을 만나면 상위의 함수를 종료한다는 뜻이다.
그러므로 case문 이하의 명령을 수행하다 break문을 만나면 상위의 함수인 switch문을 종료하고 switch문 뒤의 내용을 계속해서 수행하게 된다.
break문이 없다면?

위 예제에서 변수가 값1 이라면 명령1,2,3을 모두 수행한다.
헌데 변수가 값3 이라면 명령3만 수행한다.
이러한 특성을 잘 이용한다면 좀더 쉽게 프로그램을 짤 수 있을 것이다.

while
while문은 조건은 참인 동안 내부의 명령을 계속해서 수행한다.
조건이 참이 되지 않으면 무한루프를 돈다.

while문이 시작되면 조건문을 살펴본다.
조건이 참이면 while문 이하 명령을 수행한다.
수행이 끝나면 다시 조건문을 살펴보고 참이면 계속해서 명령을 수행하고 조건문을 살펴본다.
이렇게 계속해서 조건문을 살펴보다 조건문이 거짓이면 while문은 종료된다.
그렇기에 보통 while문이 시작되기 전에 조건문에 사용될 값이 정해지고 while문 안에서는 조건문에 사용되어지는 값이 특정 조건이 되면 변화를 시켜 조건문이 참 또는 거짓이 되도록 한다.
물론 의도적으로 조건문이 무조건 참이게 하는 경우도 있다.

do … while
do … while 문은 while 문과 비슷하다.
do … while 문은 조건문이 뒤에 존재한다.

do … while 문이 시작되면 내부의 명령을 한번 실행한다.
그리고 while문의 조건문을 검토하여 참/거짓인지 판단하여 참이라면 내부의 명령을 실행하고 거짓이라면 do … while문을 종료한다.
while문과 다른점은 만약 각 함수가 시작하기 전부터 이미 조건문이 거짓이라고 하였을때 while문은 조건을 먼저 검사하는 특성으로 인해 내부의 명령이 실행되지 않는다.
하지만 do … while문은 우선 한번은 내부의 명령을 실행한 후 조건문을 검사하기 때문에 해당 함수가 시작되기 전부터 이미 조건문이 거짓이라 하더라도 한번은 실행을 하는 것이 while문과 다른점이다.
그리고 do … while 문은 특이하게도 마지막에 ; 를 붙여준다.

break
break문은 반복문을 빠져나올때 사용됩니다.
반복문은 for, while, do … while 문 등이 있습니다.

위 예제에서 만약 break문이 없다면 for문은 0~99까지 반복을 하게 됩니다.
하지만 중간에 if문을 이용해 조건문이 참이 된다면 break문이 동작을 하게 됩니다.
break문이 실행되면 반복문의 조건과 상관없이 해당 반복문을 종료합니다.
만약 조건문이 i>50 이라고 한다면 i가 50보다 큰 51이 되면 for문을 종료하게 됩니다.
그리고 앞서 설명한 switch case 문에도 사용됩니다.

continue
break문과 비슷하게 반복문에 적용됩니다.
반복문은 for, while, do … while 문 등이 있습니다.

continue문은 반복문내에서 continue문을 만나면 이후 명령은 수행하지 말고 다음 반복문으로 넘어가라는 뜻입니다.
위 예제에서 for문은 0~99까지 1씩 증가하게 됩니다.
if문의 경우 i>50 임으로 i값이 50까지는 명령1 과 명령2 를 모두 수행합니다.
하지만 i가 51이 되고나서는 명령1을 수행후 if문으로 인해 continue가 실행되면 명령2는 수행하지 않고 for문의 다음값이 진행 됩니다.
i는 52가 되고 또 명령1은 수행하지만 if문으로 인해 continue가 실행되어 그 이하 명령은 수행하지 않고 for 반복문의 다음값으로 넘어갑니다.

return
return은 함수가 특정한 값을 되돌려 주기 위한 명령어입니다.
함수는 그 자체가 수행되고 결과값이 없이 종료가 되기도 하지만 특정한 결과값을 도출하기도 합니다.
이러한 특정한 결과값을 해당 함수를 불러온곳으로 넘겨주기 위해 return이라는 명령어를 사용합니다.

goto
goto는 특정한 곳으로 바로 이동하게 하는 명령어 입니다.
이동을 하고자하는 곳에 이름을 정하고 goto 이름 으로 해당 이름을 찾아갑니다.

goto 이름 을 만나면 이름: 이라는 곳을 찾아 간다.
break문과는 조금 다른 형태를 띈다.
break문은 반복문내에서 해당 반복문을 빠져나오는 기능만을 하지만 goto문은 특정한 위치로 갈수가 있다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다