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

전역변수와 지역변수

메카럽 2020. 9. 7. 09:12

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

이번 포스팅에서는 아두이노에서 사용하는 전역변수와 지역변수에 대해 알아보도록 하겠습니다.

사실 저도 생소한 단어라서 두 번, 세 번 읽어 보고 이해가 되어 다소 어렵게 느껴지실 수 있겠지만 또 이해하려고 마음먹고 하니 안 되는 것이 없다는 것을 다시 느끼게 되었습니다.

본격적으로 이번 포스팅에서 다루게 될 전역변수와 지역변수에 대해 알아보겠습니다.

 

아두이노와 같이 반도체 소자로 이루어진 하드웨어들은 별도의 메모리를 갖고 있습니다. 가정에서 사용하는 PC는 램(RAM)과 하드디스크(HDD) 등의 메모리 용량이 비교적 큰 편이지만, 아두이노와 같은 작은 마이크로컨트롤러는 그 용량에 한계가 있습니다. 이는 크기고 문제이고 제작 비용과 직결되기 때문입니다.

이러한 메모리의 문제로 인해 변수를 기억하고 유지하는 방법에 있어서 그 방법을 두 가지로 나누어 놓았습니다.

◆ 지역변수 (또는 로컬변수, Local Variables) : 해당 함수가 실행될 때만 만들어지고 유지되는 변수

◆ 전역변수 (Global Variables) : 스케치 파일 전체에서 실행할 수 있도록 유지되는 변수

즉, 전역변수는 스케치 내에 존재하는 모든 함수에서 접근(Access)할 수 있는 함수로 함수 외부에 선언되며, 지역변수는 함수 내에 선언된 상태로 해당 변수가 선언된 함수 내에서만 접근할 수 있습니다. 이는 스케치가 짧으면 상관 엇지만, 스케치가 길어지고 복잡해지면 프로그래밍 오류, 개발자의 실수, MCU 내 메모리 차지로 인한 실행속도 저하 등을 최소화할 수 있습니다. 여기서 "접근할 수 있다"라는 말은 해당 변수를 "사용할 수 있다"라는 말과 같습니다.

지역변수 선언위치에 따른 사용범위

아래 예제는 아두이노 IDE에서 제공하는 "Button" 예제입니다. 이 예제는 디지털 2번 핀과 연결된 버튼(스위치) 동작에 따라 13번 핀에 연결된 LED를 껐다 켰다 하는 예제입니다. 여기서 맨 첫 줄을 주석처리하고 그 결과를 살펴보겠습니다.

// const int buttonPin=2;
const int ledPin = 13;


int buttonState = 0;

void setup( )
{
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}

void loop( )
{
buttonState = digitalRead(buttonPin);

if (buttonState == HIGH)
{
// turn LED on:
digitalWrite(ledPin, HIGH);
}
else
{
// turn LED off:
digitalWrite(ledPin, LOW);
}
}

변수선언 오류 메시지

위 코드에서 맨 윗줄, "const int buttonPin=2;" 구문을 주석처리하여 무력화시킨 후 컴파일 한 결과입니다. 원래대로라면 컴파일이 제대로 되어야 하지만, 아래 오류창에는 전역변수(정수형 변수 buttonPin은 setup( )함수 위에 선언되어 있다)인 buttonPin이 선언되어 있지 않아 컴파일되지 않는다는 메시지가 뜹니다.

다시 말해서 loop( )함수 내에서 buttonPin을 호출하도록 되어 있지만, 전역변수나 지역변수로 선언이 되지 않은 상태로 인식하므로 오류가 발생하는 것입니다.

다음은 전역 변수와 지역변수를 쉽게 구분하는 코드입니다. setup( ) 함수 외부(상부)에 선언된 정수형 변수"val"은 모든 함수에서 접근(사용)이 가능한 전역변수입니다. setup( ) 함수 아래의 loop( ) 함수나 loop( ) 함수 내의 for 문 내에서도 접근할 수 있습니다.

loop( ) 함수 내의 정수형 변수 "i"와 실수형 변수 "f"는 loop( ) 함수 내에서만 사용 가능한 지역변수이며, 그 아래 for 문에서의 정수형 변수 "j"는 for 문 내의 중괄호 안에서만 유효한 지역변수입니다. 즉 변수 j는 for 반목문이 실행되는 동안에만 유지되어, 해당 변숫값이 사라지지 않고 계속 1씩 증가합니다. j값이 100을 넘어 for 반목문이 종료되면 변수 j도 함께 사라지게 됩니다.

int val;  // 전역변수 val, 모든 함수에서 변수에 대한 접근이 가능합니다.
void setup( )
{
  // 내용
}

void loop( )
{
  int i;  // 지역변수 i는 오직 loop( ) 함수 내에서만 접근이 가능합니다.
  float f;  // 지역변수 f는 오직 loop( ) 함수 내에서만 접근이 가능합니다.
  // 내용

for (int j = 0; j <100; j++)
{
  // 지역변수 j는 본 중괄호 내에서만 접근이 가능합니다.
 }
}

위 코드는 전역변수와 지역변수 슈도코드입니다.

언어는 언제나 느끼는 것이지만 상당히 난해하고 어려운 분야인 것 같습니다. 3D프린터의 한계를 뛰어 넘기위해 코드 작성부터 배우고는 있지만 사실상 예제와 인터넷에 공유되어 있는 코드가 있어 그대로 쓰기만 하면 됩니다. 하지만 창의적인 것을 하기 위해 언제든지 나의 생각을 프로그래밍 할 수 있어야 될 것 같아 어렵지만 배우고 있습니다. 여러분들도 현재 어떤 것들을 도전하고 계신분들이 계시겠지만 중도 포기하지 말고 끝까지 해보시기 바랍니다.

끝까지 갔을 때 이것이 죽인지 밥인지 확인은 해봐야 속이 시원할테니까요.

태풍이 근접해서 비와 바람이 많이 불고 있습니다. 안전사고 조심하시고 태풍도 무사히 빠져나가길 바랍니다.

오늘하루도 행복한 하루되세요.

728x90