3D프린터와 아두이노/아두이노

함수 : FUNCTIONS

메카럽 2020. 9. 8. 09:34

안녕하세요. 메카럽입니다.

이번 포스팅에서 다룰 내용은 바로 함수입니다. 일단 함수라는 말만 들어도 수학시간이 생각나서 머리가 지끈지끈 거리는 것이 일반적입니다. 물론 저도 머리가 많이 지끈거리긴 합니다. 그래도 해야하기 때문에 끝까지 이해해보려 노력하고 있습니다. 그러면 이번에 다룰 함수에 대해 알아보도록 하겠습니다.

 

아두이노를 작동하려면 스케치를 컴파일하고, 이것을 다시 업로드하려면 실제 "스케치작성"이란 과정이 필요합니다. 국어, 영어 등 언어는 해당 언어를 사용하는 사람 간의 어떤 법칙(문법)에 따라 작동됩니다. 스케치 또한 이와 마찬가지로, 스케치 작성 문법을 알고 있어야 원활한 코드 작성이 가능합니다. 아두이노와 같이 순차적인 흐름에 의해 작동하는 마이크로컨트롤러는 대부분 함수로 동작합니다. 이 함수의 구조와 순서, 그 문법을 조금이라도 알고 있어야 아두이노를 작동시킬 수 있습니다. 시중의 서적이나 인터넷 강의 등을 통해 스케치 작성법, 문법 등을 알아가는 것도 좋지만 가장 좋은 방법은 제대로 작성된 예제를 살펴보며 익히는 것이 빠른 방법입니다.

 

아두이노의 스케치는 기본적으로 함수의 조합으로 이루어져 있습니다. 함수, 영문으로 Function은 "기능"이란 뜻으로 사용됩니다. 아두이노가 제대로 기능하기 위해 꼭 필요한 것 중 하나가 함수이므로 이 또한 맞는 말일 것입니다.

 

우리는 중학교에 다닐 즈음, 수학 시간에 함수와 관련하여 배웠던 기억이 있을 것입니다. 두 변수 x와 y에 대해 x가 결정되면 이에 따라 y값도 결정될 때, y를 x의 함수라고 합니다.

y = f(x)

IDE 실행화면

함수는 코드(스케치) 내에서 어떤 기능을 수행하기 위한 도구를 의미합니다. 아두이노 스케치에서 중괄호"{ }" 내에 실행할 함수들이 위치하며, 아두이노 IDE 초기화면에서 void setup과 void loop 다음에 위치한 중괄호 내의 부분들이 그것입니다. 아두이노 스케치에서 함수는 다음과 같은 형태로 사용됩니다.

리턴 타입 함수명(파라미터)
 {
    처리구문
 }

리턴 타입은 void, float, int 등이 해당되고, 그 이후에 해당 함수의 이름이 위치합니다. 이후 소괄호 내에 함수의 파라미터를 입력하고, 중괄호 내에 처리 구문을 기입합니다. 다음 아래 제시한 코드는 정수형을 리턴하며, Function이란 이름을 갖는 함수이며, 정수형의 value란 파라미터를 포함하고 있습니다. value에 100을 곱하여 정수형 computedValue를 리턴하는 함수입니다.

int Function(int value)
{
  int computedValue = 100 * value;
  return computedValue;
}

조금 더 구체적인 예제를 살펴보겠습니다. 다음은 i=2, j=3, 그리고 myMutiplyFunction이란 함수에 의해 i와 j가 곱해진 결과값 k를 500ms 단위로 시리얼 모니터를 통해 출력하는 코드입니다.

 

setup( ) 함수에서는 개발자들이 시리얼 모니터를 통해 결과값을 볼 수 있도록 그 통신속도를 설정해주고 있습니다. 이어 loop( ) 함수에서는 세 가지 변수를 선언해줍니다ㅏ. 이어 k란 정수형 변수에 myMutiplyFunction이란 함수를 액세스하며 얻은 결과를 저장시키며, 이 값을 시리얼 모니터로 출력합니다. 그리고 500ms 시간 지연을 갖습니다.

 

참고로 이런 시간 지연을 두지 않으면 시리얼 모니터를 통해 출력되는 데이터양이 너무 많아 제대로 확인하기가 어렵게 됩니다.. 시리얼 모니터로 결과값을 확인할 때는 적절한 수준의 시간 지연을 두시기 바랍니다.

void setup( )
{

  Serial.begin(9600);  // 시리얼 통신속도 설정
}

void loop( )
{
  int i = 2;  // 정수형 변수 선언 : i=2
  int j = 3;  // 정수형 변수 선언 : j=3
  int k;      // 정수현 변수 선언 : k

  k = myMultiplyFunction(i, j);
  Serial.println(k);  // 시리얼 모니터로 k값 프린트
  delay(500);       // 500ms 지연
}

int myMultiplyFunction(int x, int y)
{
  int result;  // 정수형 변수 "result"선언
  result = x * y;
  return result;
}

loop( ) 함수를 빠져나오면 그 다음 줄에 있는 int myMultiplyFunction 함수를 만납니다. 이 함수는 정수형 변수인 x와 y를 입력받아 곱한 수 result로 리턴하는 함수로 리턴값은 loop( ) 함수 내의 k값으로 위치하게 됩니다. 즉, loop( ) 함수에서 다음과 같이 int myMultiplyFunction 함수를 호출할 때, 해당 함수를 액세스하게 됩니다.

k = myMultiplyFunction(i, j);

해당 함수를 뜯어서 살펴보면,

◆ int : 정수형(integer의 줄임말인 int), 즉 이 함수에 의해 출력될 값이 정수임을 나타냅니다.

◆ myMultiplyFunction : 함수 이름이 myMultiplyFunction임을 나타냅니다.

◆ (int x, int y) : myMultiplyFunction 함수에 입력할 데이터도 정수형 변수임을 나타내며, 정수형 데이터 2개를 입력받아 x와 y라고 나타냅니다.

 

다시 풀어보면, myMultiplyFunction 함수에 정수 2개(x와 y)를 입력받아 함수 뒤쪽에 있는 중괄호 내의 과정을 거쳐 그 결과를 얻을 수 있다는 말과 같습니다.

 

이 스케치의 실행화면을 아래 그림에 나타내었습니다. 시리얼 모니터를 통해 출력되는 값은 "6"dlrh, 500ms 시간 간격을 두고 지속해서 출력됩니다. 그리고 모든 구문의 끝에는 세미콜론(;)이 위치해야 합니다. 세미콜론을 찍어주지 않은 구문에서 잦은 에러가 발생하므로 컴파일 에러가 발생하면 이것부터 찾아보는 것이 빠른 해결책 중 하나입니다.

myMultiplyFunction 실행화면

위 예제 또는 다른 예제들에서 슬래시 2개를 붙인 후 어떤 코멘트들이 기재되어 있는 것을 볼 수 있습니다. 이것들은 해당 라인에 대한 주석을 나타냅니다. 몇 줄에서 수십 줄 수준의 코드라면 어떤 함수인지, 어떤 변수인지 등 쉽게 떠올릴 수 있지만, 코드의 길이와 분량이 많아지거나, 중간중간 내용을 변경하게 되면 어떤 내용인지 직관적으로 더올리기 어렵게 됩니다. 이때 실행할 코드 외에 무시해도 되는 글자, 숫자 등을 참고로 기입하는 것이 "주석"입니다. 슬래시 두 개를 긋고 그 뒤쪽에 주석을 기입합니다. 이 때 긋는 슬래시를 싱글 라인 코멘트라고 부릅니다.

 

주석이 한 두 줄로 끝나지 않는 경우에는 슬래시 두 개를 일일이 긋는 것보다 주석 시작 시점에 "/*"를, 주석이 끝나는 시점이 "*/"를 입력합니다. 이 경우 두 표시 사이에 있는 글자, 숫자 등은 모두 주석처리가 되며 이 기호를 가리켜 블록 코멘트라 합니다. 주석 처리를 위한 동일 목적이 있지만 간편성을 고려하여 두 가지 방식으로 나뉘어 놓은 내용입니다.

 

블록 코멘트는 다량의 코드를 무력화시키거나 주석 처리를 위해 손쉽게 사용되지만 주의해야 할 점이 한 가지 있습니다. 코드 작성과 컴파일 도중 불필요해 보이는 내용을 임시로 지우거나 무력화 시키기 위해 사용하기도 하는데 코드를 썼다가 고쳤다 지웠다 하는 도중 주석 표시가 남아 있어 실행에 영향을 주는 경우입니다. 컴파일 에러가 뜨는데 어떤 부분이 에러인지 찾기 힘든 경우에는 주석 표시 일부를 남겨두지 않았는지 살펴볼 필요가 있습니다.

728x90