만져보는 임베디드 시스템/아두이노 소프트웨어

아두이노 소프트웨어-iv.변수

hanjinee 2020. 12. 31. 00:35

안녕하세요 제타지니입니다. 인생에는 참 변수가 많죠 오늘은 아두이노의 변수형에 대해서 배워보고자 합니다. 

변수에 대해서 알아봅시다. 애초에 변수 변할 수 있는 수를 뜻하고, 상수 변할 수 없이 정해진 수를 말하지요?

애초에 C/C++에서 중괄호 내에 위치하는 코드는 하나의 블록을 형성합니다.

이 하나의 블록은 여러 개의 하위 블록을 포함할 수 있으므로, 블록들은 '계층 구조'를 이루고 있습니다. 

블록이 중첩된 경우에는 유효 범위가 가장 좁은 변수가 우선하며, 이 우선순위는 동일한 이름의 변수가 여러 개 존재할 때 유효한 변수를 결정하기 위해 사용됩니다. 하지만, 하나의 블록 내에서 동일한 이름의 변수가 두개 이상 존재할 수 없다는 점은 알아 두시길!

여하튼, 변수는 두 가지로 나뉘는데, 지역변수와 전역 변수로 나뉩니다. 

 

지역변수 

-가장 가까이 있는 중괄호 쌍 내에서만 유효

-선언된 지역에서 벗어나면, 컴퓨터는 그 변수를 인지하지 못함

 

전역변수

-코드 전체에서 유효

-코드의 맨 위에서 선언하는 편

 

이렇게 변수는 두 가지로 나뉘게 되는데, 유효 범위 이외에도 몇 가지 지정자를 사용할 수 있습니다만, 많이 사용되는 지정자는 static, volatile, const, extern가 있습니다. 

 

static

-선언 위치에 따라 일반 변수와 동일한 유효 범위를 가짐

(선언된 위치를 벗어나도 변수는 소멸하지 않음 but 선언된 유효범위 안에서만 호출과 접근 가능)

-선언된 지역, 유효 범위를 벗어나도 소멸되지 않고 그 '값을 유지' 

(=즉, 루프 안에서 static 변수를 선언하면, +,-,*,/를 해도 원래 선언된 값을 유지)

 

volatile

-휘발성 변수라고 함. 

-스케치를 컴파일할 때 최적화에서 제외(-'수정 가능한 변수'라고 컴퓨터에게 알려주어서 최적화에서 제외 시킴)

(최적화 과정: 실행 파일의 크기를 줄이거나 속도를 높이는 기능을 수행)

(실행 과정 중 정상적인 처리 순서에서 벗어나 명령어를 처리하는 경우 최적화로 인해 잘못된 결과가 나올 수 있음. )

-인터럽트 서비스 루틴에서 값을 변경하는 변수는 volatile로 선언

(인터럽트에 의해 정상적인 처리 순서를 벗어나 인터럽트 처리 루틴으로 이동하는 경우)

 

const

-상수

-선언에서 값이 할당된 이후 그 값을 바꿀 수 없는 변수

(=선언할 때 한 번 값을 대입 가능 but 이후 변경 가능)

 

#define(vs const)

-#define은 전처리기에서 처리하는 명령어

-유효범위 없음​(전역)

-메모리 차지하지 않음 = 값을 대입할 수 없음

-read 만 가능

 

extern

-static과 같은 성질을 지님

-하지만, 유효범위를 벗어나도 호출, 접근 가능

-다른 파일에서도 호출, 접근 가능

(즉, 라이브러리에서 extern으로 선언된 자료형은 다른 코드에서도 호출 가능)

728x90