콘텐츠로 건너뛰기

아두이노 변수와 자료형 알아보기, 아두이노 기초

    들어가며

    이 자료에서는 아두이노 변수와 자료형에 대해 설명합니다. 변수와 자료형을 이해하고, 이를 통해 간단한 프로그램을 작성해 보도록 하겠습니다. 변수와 자료형은 프로그래밍의 아주 기초적인 지식으로, 기본기를 알고 있어야 더 나아가 복잡한 프로그래밍도 할 수 있을 것 입니다. 아두이노 변수와 자료형에 대해 알아보겠습니다.

    아두이노 변수와 자료형

    Arduino에서 프로그래밍을 할 때, 변수와 자료형은 데이터를 저장하고 조작하는 데 사용하는 필수 요소입니다. “변수”는 프로그램 내에서 데이터를 저장하기 위한 공간이며, “자료형”은 변수에 저장할 수 있는 데이터의 종류를 정의합니다.

    변수와 자료형에 대한 공식문서

    변수의 선언과 초기화

    변수를 사용하기 위해서는 먼저 선언해야 합니다. 선언 시 변수의 자료형을 지정하고, 필요하면 초기값을 설정할 수도 있습니다. 선언된 변수는 아래에서 변경하거나 불러와 사용할 수 있습니다.

    int myNumber;  // 정수형 변수를 선언
    myNumber = 10; // 변수에 값을 할당
    
    int mySecondNumber = 20; // 선언과 동시에 초기화
    
    myNumber = 20; // 변수의 값이 10에서 20으로 변경

    자료형의 종류

    다양한 자료형이 있으며, 각 자료형은 특정 종류의 데이터를 저장하는 데 사용됩니다. 아래는 Arduino에서 자주 사용되는 자료형과 그 특성을 요약한 표 입니다.

    자료형크기범위설명
    boolean1 바이트true 또는 false참/거짓 값 저장
    char1 바이트-128 ~ 127문자 저장
    byte1 바이트0 ~ 255부호 없는 8비트 정수 저장
    int2 바이트-32,768 ~ 32,76716비트 정수 저장
    unsigned int2 바이트0 ~ 65,535부호 없는 16비트 정수 저장
    long4 바이트-2,147,483,648 ~ 2,147,483,64732비트 정수 저장
    unsigned long4 바이트0 ~ 4,294,967,295부호 없는 32비트 정수 저장
    float4 바이트3.4028235E+38 ~ -3.4028235E+38단정밀도 부동소수점 저장
    double4 바이트
    / 8 바이트
    3.4028235E+38 ~ -3.4028235E+38
    1.7E+308 ~ -1.7E+308
    Arduino에서는 float과 동일

    8비트 기반의 마이크로 컨트롤러와 32비트 기반의 마이크로 컨트롤러에서 자료형의 범위가 달라질 수 있습니다. ESP32등이 32비트 컨트롤러중 하나입니다.

    변수의 사용 예시

    변수를 선언하고 사용하는 예시입니다. 아래 예시를 통해 어떠한 변수에 어떠한 값들을 할당할 수 있는지 한번 알아보세요.

    void setup() {
      Serial.begin(9600); // 시리얼 통신 시작
    
      // boolean 변수 사용 예시
      boolean ledState = true;
      Serial.println(ledState); // 1 출력 (true)
    
      // char 변수 사용 예시
      char myChar = 'A';
      Serial.println(myChar); // A 출력
    
      // int 변수 사용 예시
      int myInt = 100;
      Serial.println(myInt); // 100 출력
    
      // unsigned int 변수 사용 예시
      unsigned int myUnsignedInt = 200;
      Serial.println(myUnsignedInt); // 200 출력
    
      // long 변수 사용 예시
      long myLong = 1000000;
      Serial.println(myLong); // 1000000 출력
    
      // unsigned long 변수 사용 예시
      unsigned long myUnsignedLong = 2000000;
      Serial.println(myUnsignedLong); // 2000000 출력
    
      // float 변수 사용 예시
      float myFloat = 3.14;
      Serial.println(myFloat); // 3.14 출력
    
      // double 변수 사용 예시
      double myDouble = 3.14159;
      Serial.println(myDouble); // 3.14159 출력
    }
    
    void loop() {
      // 반복 실행되는 코드
    }

    변수의 사용 범위

    변수의 선언 위치에 따라 변수를 사용할 수 있는 범위가 달라지게 됩니다. 변수는 선언된 위치에 따라 전역 변수(Global Variable)와 지역 변수(Local Variable)로 나뉩니다.

    • 전역 변수: 함수 밖에서 선언되며, 프로그램 전체에서 접근 가능합니다.
    • 지역 변수: 함수 내에서 선언되며, 해당 함수에서만 접근 가능합니다.
    int globalVar = 10; // 전역 변수
    
    void setup() {
      Serial.begin(9600);
    }
    
    void loop() {
      int localVar = 5; // 지역 변수
      Serial.println(globalVar); // 10 출력
      Serial.println(localVar); // 5 출력
    }

    지역 변수를 출력하지 못하는 경우

    위의 예제에서는 외부에서 선언된 변수와 내부에서 선언된 변수를 함께 출력할 수 있었지만, 사용하지 못하는 경우도 한번 살펴봐야겠죠. 다음 예제는 setup() 함수에서 선언한 변수를 loop() 함수에서 출력하려고 할 때 발생하는 오류를 보여줍니다.

    예제 코드

    void setup() {
      Serial.begin(9600); // 시리얼 통신 시작
    
      int localVar = 5; // setup() 함수 내에서 지역 변수 선언
      Serial.println(localVar); // setup() 함수 내에서는 정상적으로 출력됨
    }
    
    void loop() {
      // setup() 함수 내에서 선언된 localVar를 loop() 함수에서 출력하려고 시도
      Serial.println(localVar); // 오류 발생: localVar는 loop() 함수 내에서 유효하지 않음
    }

    코드 설명

    • setup() 함수 내에서 int localVar = 5;로 지역 변수를 선언하고 값을 초기화합니다.
    • setup() 함수 내에서는 Serial.println(localVar);localVar를 정상적으로 출력이 가능합니다.
    • loop() 함수 내에서 Serial.println(localVar);setup() 함수 내에서 선언된 localVar를 출력하려고 시도합니다.
    • 이 시도는 오류를 발생시킵니다. 이유는 localVarsetup() 함수 내에서만 유효한 지역 변수이기 때문입니다. localVarsetup() 함수가 종료되면 메모리에서 사라지므로 loop() 함수에서는 접근할 수 없습니다.
    결과적으로 위 코드는 실행조차 불가능하다. 코드를 컴파일하면 에러가 발생한다.

    이 예제를 통해, 변수의 범위가 함수 내에서만 유효함을 알 수 있습니다. 지역 변수는 선언된 함수 내에서만 접근 가능하며, 다른 함수에서는 사용할 수 없습니다. 이를 해결하려면 전역 변수를 사용하거나, 변수의 값을 함수 간에 전달하는 다른 방법을 사용해야 합니다. (나중에 배울 예정)

    상수

    위에서 사용해보았던 변수와 달리, 상수(constant)는 값을 변경할 수 없습니다. const 키워드를 사용하여 상수를 선언합니다.

    const int ledPin = 13; // 상수 선언
    
    void setup() {
      pinMode(ledPin, OUTPUT);
    }
    
    void loop() {
      digitalWrite(ledPin, HIGH); // LED 켜기
      delay(1000);
      digitalWrite(ledPin, LOW);  // LED 끄기
      delay(1000);
    }

    상수의 특성을 이용하여 좀더 수월한 프로그래밍이 가능합니다. 의미있는 숫자들을 상수로 선언하여 사용하거나, 반복적으로 사용하는 변수일 경우 상수로 선언해 둔 값만 변경하는 식으로 유지보수를 좀 더 편리하게 하기도 합니다.

    또한 상수는 값이 변경되지 않는다는 특성이 있어 실수로 값이 변경되는 것을 방지할 수 있습니다. 이는 코드의 안정성을 높여주죠.

    변수 선언시 주의 사항, 변수 이름 규칙

    변수 이름을 지정할 때는 다음 규칙을 따릅니다:

    • 알파벳, 숫자, 언더스코어()만 사용 가능: 변수 이름은 알파벳(a-z, A-Z), 숫자(0-9), 언더스코어()로만 구성할 수 있습니다.
    • 숫자로 시작 불가: 변수 이름은 숫자로 시작할 수 없습니다.
      int myVar; // 올바른 변수 이름
      int 1stVar; // 잘못된 변수 이름
    • 대소문자 구분: 변수 이름은 대소문자를 구분합니다. myVarmyvar는 서로 다른 변수로 취급됩니다.
      int myVar;
      int myvar; // myVar와는 다른 변수
    • 예약어 사용 불가: 변수 이름은 Arduino에서 예약된 키워드(예: int, float, if, while 등)를 사용할 수 없습니다.

    마무리

    Arduino에서 변수와 자료형의 중요성을 이해하고, 이를 사용하여 간단한 프로그램을 작성하는 방법을 배웠습니다. 변수와 자료형은 코딩을 할 때 아주 아주 기초적이면서 필수적인 내용입니다. 앞으로 여러 코드를 접해가면서 자연스럽게 익히게 될 테니, 지금 이해가 잘 안되더라도 너무 걱정하지 마세요. 계속 한다면, 결국 이해하게 될 거에요

    변수와 자료형의 기본 개념, 변수 선언 및 초기화 방법, 다양한 자료형의 활용법 세가지에 대해 배워봤는데요 내용이 기억이 나지 않는다고요? 그럼 한번만 더 읽어보고, 그래도 이해가 안되다면 다음 단계로 일단 나아가 보시죠. 반복해서 사용하며 자연스럽게 이해하길 기도하자고요.