함수에 해당하는 글 1

[아두이노] 아두이노 코딩 사용자 정의 함수

IOT/아두이노기초문법|2019. 4. 15. 09:00

[아두이노] 아두이노 코딩 사용자 정의 함수



오늘은 제어문이 아닌 사용자 정의 함수에 대해서 살펴보도록 하겠습니다. 사용자 정의 함수라는 것은 프로그래머가 직접 만든 함수를 지칭합니다. Serial 라이브러리에서 제공되는 println()함수을 이용하여 우리는 쉽게 시리얼모니터로 직접 메세지를 출력했습니다. 시리얼통신을 위한 프로그램 코딩을 직접 만들 필요 없이 이런 함수들을 호출로 쉽게 코딩했습니다. 만약 프로그래머가 어떤 명령 로직을 짜놓고 그것을 함수로 만들어 놓으면 어떻게 될까요. 만든 함수를 원하는 위치에 호출만으로 해당 명령 로직을 수행 할 수 있게 됩니다. 이 사용자 정의 함수는 아두이노 코딩에서 꼭 필요한 개념이니깐 꼭 알아두세요. 본격적으로 사용자 정의 함수에 대해서 살펴보도록 하겠습니다.

1. 사용자 정의 함수



위 그림은 간단히 사칙연산에서 덧셈을 사용자 정의 함수로 표현한 예제입니다. 글보다는 실제 모습을 보여주고 설명하는게 빠를 것 같아서 간단히 덧셈함수를 만들어 보았네요.

우선, 사용자 정의 함수는 앞에 자료형이 붙습니다. 함수에 자료형이 붙는다는게 약간 이해가 안될 수 있는데 이 자료형은 사용자 정의 함수에서 반환되는 값의 자료형입니다. 함수에서 어떤 계산을 하고 특정한 값을 반환 시킬때 그때 그 값의 자료형으로 생각하시면 됩니다.

다시 설명을 하자면.


위 그림에서 add(10,20)의 사용자 정의 함수가 a, b에 10과 20의 인자가 되고 사용자 정의 함수에 던져주고 사용자정의 함수에서는 이 인자값을 기준으로 10+20의 계산이 이루어지겠죠. 그러면 덧셈함수이니 30이란 값이 계산되어 나옵니다. 이때 30이란 값이 반환 시킬 때 30의 자료형이라고 생각하시면 됩니다. 30이니깐 사용자 정의 함수의 자료형은 int add() 함수가 되겠죠. 어떤 자료형인지 아시겠지요. 그리고 반환시키는 명령어가 return 이라는 명령어가 수행합니다. "return a+b;" 하면 a+b의 값을 반환하시오라고 말로 이해하시면 됩니다.

결론, 위 그림처럼 a+b의 값을 return 반환 명령어로 반환되는 값이 정수형이니깐 함수 앞에다 int형을 붙였이게 된다는 것을 기억해 주세요.



그리고, void라는 표현이 있는데 이건 의미적으로 '빈'으로 비어있는 반환값이 없는 함수라는 생각하시면 될 듯 싶네요. 반환시킬 값이 있으면 반환되는 값의 자료형으로 함수 앞에 붙이시고요. 반환값이 없으면 void란 단어를 붙여서 표현하시면 됩니다.

[ 코딩 ]


[ 결과 ]


프리젠테이션에서 그림 그리기에 재미 붙여서 그림으로 만들었네요. 위 그림에서 보는 것 같이 대충 이런식으로 표현하시면 됩니다. 참고로 함수에 인자가 있을 때는 사용자 정의 함수에서는 인자 값에 맞게 자료형을 각각 선언해야하는 것은 꼭 기억해 주세요.

특이한 점은 아두이노에서는 사용자 정의 함수를 하단에 표현해도 됩니다. C 컴파일러에서는 하단에 표현할 경우 상단에 함수명을 선언해 줘야 합니다. 이게 좀 특이하더군요.

C언어의 경우,

int add(int a, int b){
  return a+b;
}
int main(void)
{
    int c=0;
    c= add(10,20);
    printf("%d\n",c);
    return 0;
}

이렇게 상단에 표현 해줘야 합니다. 아니면 하단에 표현할경우 상단에 해당 사용자 함수명을 선언을 꼭 해줘야 합니다.

int add(int a, int b);
int main(void)
{
    int c=0;
    c= add(10,20);
    printf("%d\n",c);
    return 0;
}
int add(int a, int b){
  return a+b;
}

나중에 코딩한 뒤에 컴파일 때 문제가 생깁니다. main()함수가 먼저 코드에 대해 처리하면 add()라는 함수가 정의되어 있지 않기 때문에 에러가 발생합니다. 그래서 main()앞에 표현을 하던 main()함수 앞에 함수 선언을 해 줘야 합니다. 혹시 C언어 컴파일로 사용자 정의 함수를 사용했는데 에러가 발생하는 이유를 찾지 못하고 해맬 수 있으니깐 이 부분을 주의해 주세요.

아두이노에서는 그냥 상관없이 돌아가더군요. 아두이노 내부에서는 setup(), loop()함수를 처리하는 main() 함수가 따로 하단에 있어서 loop() 아래 표현을 해도 main() 함수 상단에 표현된 것인지 모르겠군요.

3. 아두이노에서 사용자 정의 함수


아두이노에서는 언제 사용하면 좋을까요. 아마 초음파 센서 제어편과 3색 LED 제어편에서 보셨을 꺼에요. 초음파 센서를 이용하여 거리를 측정하는 식을 사용자 정의 함수로 만들어 놓으면 편하게 호출만으로 해당 명령을 수행할 수 있게 됩니다.



void loop() {  
  if(digitalRead(5)==0){
    float v1=UltrasonicDistance(6);
    float v2=UltrasonicDistance(7);
    float total=v1+v2+10;
    Serial.println(total);
    delay(500);
  }  
}

위 로직에서 UltrasonicDistance()함수는 사용자 정의 함수로 거리를 측정하는 함수입니다. 참고예제에 가셔서 보시면 잘 나와 있습니다. loop()함수에서 두번 호출되었는데 만약 그냥 코딩을 했다면 UltrasonicDistance()안에 로직이 좀 길고 두번 중복 코딩을 했겠죠. 단 두줄로 코딩할 것을 꽤 길게 코딩을 하게 된다면 비효율적인 코딩으로 가독성도 떨어지겠죠.

위 코딩에서는 뭔지는 모른데 사용자정의함수에서 계산된 값이 v1과 v2에 저장되고 이 값들고 10을 더한 값을 시리얼모니터로 출력했네하고 쉽게 코드를 해석할 수 있습니다. 뭔가 복잡한 로직을 사용자 정의 함수로 만들어 외부로 빼놓으면 위에서 표현한 것처럼 쉽게 의미 전달 형태의 코딩으로 표현 할 수 있게 됩니다. 이게 바로 사용자 정의 함수의 장점입니다.



void loop(){
    Color(255,0,0);
    delay(1000);
    Color(0,255,0);
    delay(1000);
    Color(0,0,255);
    delay(1000);
}

위 로직에서 Color()함수는 사용자 정의 함수입니다.

void Color(int red, int green, int blue)
{
  analogWrite(rpin, red);
  analogWrite(gpin, green);
  analogWrite(bpin, blue); 
}

코딩은 간단합니다. 세개의 출력핀에 아날로그 값을 출력하는 명령어 입니다. 그런데 외부로 빼서 사용자 정의 함수를 만든 이유가 뭘까요. 바로 중복 코딩을 제거하는 방식입니다. loop()함수는 R->G->B로 순서대로 색이 1초단위로 출력됩니다. 문제는 하나의 색을 만들려면 RGB핀 3개에 아날로그 신호를 보내는 세줄의 명령어를 코딩해야 합니다. 그러면 코딩을 analogWrite()함수를 9번 코딩해야 합니다. 이걸 길게 코딩해 놓으면 시각적으로 보면 가독성이 떨어지고 무슨색이 출력되는지도 쉽게 알 수 없습니다.
하지만 사용자 정의 함수로 표현을 하면,

Color(255,0,0);
Color(R, G, B);

시각적으로 R의 인자만 255니깐 빨간색이구나하고 쉽게 해석할 수 있습니다. 이렇게 중복되는 코딩을 줄일 수 있고 가독성을 높이는 효과를 지닌게 바로 사용자 정의 함수입니다.

사용자 정의 함수를 쓰면 얼마나 좋은지 아시겠지요.

마무리


원래는 C언어 하면 포인트 변수를 배워야 하는데 그건 생략하겠습니다. 지금까지 배운 변수, 배열변수, IF, For, While, Switch, 사용자 정의 함수였네요. 이정도만 이해하시면 아두이노를 사용하는데 아무런 문제가 없습니다.
C언어는 이외에도 더 많은 문법이 있지만 사실 그렇게 까지는 아두이노에 사용되지는 않습니다. 알고 있으면 좋기는 하지만 위 기초정도만 이해하시면 왠만한 표현은 다 하실 수 있습니다.

이정도만 이해하실 수 있으면 다른 프로그램 언어도 충분히 독학으로 배우 실 수 있습니다. 모든 프로그램 언어의 문법은 거의 비슷하거든요. C언어만 잘하면 다른 언어를 배우는데 그렇게 어렵지 않습니다. 단지 처음에 표현하는 부분만 익숙치 않을 뿐이죠.

암튼 기본적으로 사용하는 기초만 이해하시면 무난히 아두이노를 제어 하실 수 있습니다.
포인트랑 클래스까지 더 나가고 싶지만 이부분은 프로그램 언어 영역이라 아두이노에 대한 흥미를 읽을 수 있기 때문에 너무 깊게 들어가는 것은 좀 문제가 있겠죠.

사설이지만 이번에 설명한 개념을 가지고 자바스크립트언어를 살작 독학으로 공부하셔서 Steem API를 사용해 보세요. 그리 어렵지 않을꺼에요. 스티미언 분들이라면 Steem API를 다루면 효율적인 스티미언 활동을 할 수 있습니다. 여기서 제공되는 함수들을 불러다 쓰기만 하면 되니깐요. Steem 블록체인을 읽고 쓸 수 있으면 많은 것들을 할 수 있게 됩니다. 그러니 한번 여기까지 따라오셧으면 w3school 사이트에 가셔서 자바스크립트 문법을 독학하시고 Steem API를 접근해 보세요.

아무튼 기초설명은 이정도로 해서 마무리 합니다.

댓글()