[아두이노 초급] 9. int (숫자형 자료형)

이번 포스트에선 지금까지 했던 코드를 좀 더 가독성있게 만드는 방법에 대해 알아보자.

가독성 있다라는 말을 다르게 살펴보면 다른 사람들도 이 코드를 보고 어떤 내용인지 알 수 있다라는 말이 될 수 있고 아니면 미래의 내가 이 코드를 봤을 때 쉽게 파악할 수 있다라는 말이 된다.

사실 한 개발자가 코드를 작성하는 시간보다 기존 코드를 읽고 분석하는 시간이 더 많이 걸린다라는 말이 있을 정도로 가독성은 코딩의 핵심 요소 중 하나로 볼 수 있다.

그럼 이전 포스트에서 했던 RGB LED를 동작 시켰던 코드를 생각해보자.
( https://polnalab.com/arduino/basic/458/ )

코드 1 RGB LED
void setup() {
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
}

void loop() {
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  delay(1000);
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, LOW);
  delay(1000);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, HIGH);
  delay(1000);
}

코드 1이 이전 포스트에서 했던 RGB LED를 동작하는 코드다.

그런데 이전 포스트를 보고 했더라면 알았던 코드가 지금 시간이 지나고 본다면 코드가 어떤 의미인지 알기 어렵다.

단순히 동작은 알 수 있다.

9, 10, 11번 핀을 출력 설정하고 각각 하나씩 순서대로 켜보는 코드다.

그런데 여기서 핵심은 도대체 9, 10, 11번에 연결된 것이 무엇인지 모른다라는 것이다.

우리가 배운 것만 생각을 해봐도 단순히 단색 LED가 연결되어 있을 수도 있고 아니면 RGB LED가 연결되어 있을 수도 있다.

RGB LED가 연결되어 있다고 알아도 문제다.

어떤 데이터 핀이 어떤 색의 LED에 연결되어 있는지 알 수 없기 때문이다.

그렇기 때문에 이런 경우에는 알아보기 쉽게 각 번호에 고유 이름 또는 별명을 지어주면 좀 더 보기 편할 것이다.

이럴 때 사용하는 것이 변수(variable)다.

변수는 이름 그대로 변하는 값을 의미하고 값이 변하기 때문에 마이크로컨트롤러에 변수의 이름으로 그 값이 저장되게 된다.

이때 값의 종류에 따라서 숫자를 저장한다면 숫자형 변수, 문자를 저장한다면 문자형 변수 등으로 말하게 되는 것이다.

뭐, 어렵게 들린다면 간단하게 지금 사용하는 건 숫자에 이름을 붙여서 사용한다 정도로 기억하면 되겠다.

그럼 변수를 사용해보자.

코드 2 RGB LED
int R = 9;
int G = 10;
int B = 11;

void setup() {
  pinMode(R, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(B, OUTPUT);
}

void loop() {
  digitalWrite(R, HIGH);
  digitalWrite(G, LOW);
  digitalWrite(B, LOW);
  delay(1000);
  digitalWrite(R, LOW);
  digitalWrite(G, HIGH);
  digitalWrite(B, LOW);
  delay(1000);
  digitalWrite(R, LOW);
  digitalWrite(G, LOW);
  digitalWrite(B, HIGH);
  delay(1000);
}

변수를 사용해서 코드를 수정하면 코드 2와 같이 되는데 이번에는 9, 10, 11번 핀이 어떤 LED에 연결되어 있는지 확실히 쉽게 알 수 있다.

그리고 만약 RGB LED의 핀 번호를 변경하더라도 전체 코드를 수정하는 것이 아닌 위에 변수의 값만 변경하면 되니 유지 보수도 편리하다고 할 수 있겠다.

다시 코드로 돌아와서 코드를 보면 void setup 위로 3개의 변수를 설정해 주었다.

변수를 설정할 때 보면 앞에 ‘int’라는 문구가 들어가 있는데 이게 현재 만들어진 변수의 형태를 의미한다.

int Name
– Name을 정수형 변수로 선언
ex) int LED = 2;

이 int라는 것은 ‘integer’이라는 단어의 약자로 ‘정수’를 의미한다.

정수는 소수점이 없는 수로 수학 시간에 말하는 정수와 같은 의미를 가진다.

그래서 int R = 9; 라고 하면 9라는 정수에 R이라고 하는 이름을 붙인다라고 생각하면 된다.

아니면 9라고 하는 정수를 R이라는 이름의 변수에 저장한다라고 봐도 된다.

정리하자면 int R = 9;라고 하면 R은 정수형 변수이고 이때 값은 9다라고 선언한 것이다.

그리고 이때 만약 int R = 9.6; 이렇게 작성해도 오류는 발생하지는 않는데 소수점은 저장되지 않고 앞의 정수 값만 저장되게 된다.

거기다 변수의 이름은 작성할 때 규칙이 있는데 이름의 가장 앞에 숫자가 올 수 없고 반드시 문자로 시작해야 한다.

int 9LED 와 같은 형태는 사용할 수 없다는 말이다.

그리고 띄어쓰기도 인식할 수 없다.

보통 띄어쓰기를 쓰고 싶다면 _를 이용하여 int R_LED와 같은 형태로 사용한다.

마지막으로 아두이노에서 사용하는 예약어들과 같은 이름으로 만들지 않는 것이 좋다.

사실 예약어들은 다 모르지만 변수를 작성하다보면 변수의 이름의 색이 변경되는 경우가 있다.

그런 경우에는 예약어의 이름과 비슷하다는 의미이니 이름을 변경하는 게좋다.
(사실 엄밀히 말하면 모두 예약어는 아니고 일부는 아두이노 IDE에서 보기 쉽게 색상을 입혀 놓은 키워드다. 하지만 굳이 겹치지 않는 것이 좋다.)

그리고 변수는 지금처럼 int R = 9;와 같이 명확한 값을 가지기도 하고 이렇게 설정할 수도 있다.

int R;

이렇게 설정하면 R은 정수형 변수인데 현재 저장된 값은 없다라고 이해하면 된다.

추후 값을 저장하겠다라는 의미다.

그리고 변수의 경우 사용범위가 있다.

지금과 같이 void setup 위로, 다시 말해 어떤 괄호 안에 적혀있는 것이 아니라면 모든 곳에서 사용가능한 변수로 이런 것을 ‘전역 변수’라고 한다.

만약 변수가 setup 안에 위치해 있다면 setup 안에서만 해당 변수가 지정된 것으로 그 안에서만 사용할 수 있다.

void setup() {
int R = 9;
int G = 10;
int B = 11;
pinMode(R, OUTPUT);
pinMode(G, OUTPUT);
pinMode(B, OUTPUT);
}

만약 변수 선언을 setup안에 하고 loop에서 해당 변수를 사용하려고 하면 당연히 오류가 발생한다.

이런 것처럼 특정 위치에서만 사용할 수 있는 변수를 ‘지역 변수’라고 한다.

그러니 변수의 위치를 잘 보고 사용하자.

그리고 변수라고 하면 변하는 값이라고 했는데 값이 변한다라고 하면 이 값이 저장되는 공간이 필요할 것이다.

보통 아두이노에서 확인 버튼을 누르면 코드를 확인하고 완료가 되면 아래쪽에 용량이 나오게 된다.
( https://polnalab.com/arduino/basic/360/ )

이때 변수는 동적 메모리(SRAM)에 저장되게 된다.

그럼 변수가 저장된다면 변수가 가지고 있는 용량도 당연히 존재할 것이다.

우리가 앞서 이야기한 int형의 경우 보통 용량으로 2byte를 차지한다.
(아두이노 보드마다 다를 수 있으며 특히 ARM 기반 보드의 경우 용량을 확인해야 한다.)

(변수가 차지하는 동적 메모리를 알아보려면 변수 앞에 volatile을 붙이면 확인 가능한데 자세한 내용은 아래의 링크를 참고하자.)
( https://polnalab.com/arduino/qna/473/ )

그래서 int형으로 저장할 수 있는 숫자의 값도 2byte에 맞춰서 저장할 수 있다.

2byte라면 비트로는 16bit가 된다.

16bit로 표현할 수 있는 2진수의 값은 216까지 표현가능하다.

하지만 int 형의 경우 ‘정수’를 표현하는 변수임으로 정수는 양의 정수, 음의 정수 즉, 음수도 포함하고 있는 수다.

그래서 int형이 저장할 수 있는 범위는 (-2)15~ (215-1)까지다.

수치로 표현하면 -32,768 ~ 32,767까지 저장이 가능하다.

만약 이 수치를 넘기면 오버 플로우(Oveflow)라는 현상이 발생하니 넘기지 않는 것이 좋다.

그리고 만약 내가 이 변수의 값을 양수만 사용하고 싶다라고 한다면 변수의 앞에 ‘unsigned’라는 문구를 같이 사용하면 된다.

unsigned int라고 하면 양수값만 사용한다는 뜻이고 그래서 범위는 0~(216-1)까지의 범위 즉, 0~65,535까지의 범위를 가진다.

추가로 인터넷의 코드들을 보다보면 int 앞에 const라고 붙이는 경우도 있는데 이 경우에는 선언한 정수형 변수의 값을 변경하지 않고 고정하겠다라는 의미를 가진다.

자세한건 아래의 링크를 확인하자.
( https://polnalab.com/arduino/qna/473/ )

그리고 이러한 범위에 따라 설정되는 변수들이 다른데 그 부분은 아래의 표를 참고하자.

의미는 거의 동일하고 숫자의 범위만 다르다고 생각해도 좋다.

short형 같은 경우엔 우리가 사용하는 보드인 우노 보드에선 int와 차이가 없지만 다른 보드의 경우 int의 범위가 달라질 수 있어 short와 int가 표현 가능한 범위가 서로 다를 수 있다.

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
error: Content is protected !!