Search

변수의 유효범위

변수가 참조될 수 있는 범위
1.
전역 유효 범위(global scope)
하나의 파일 혹은 하나의 프로젝트 내의 모든 파일 안에서 참조 가능
2.
지역 유효 범위(local scope)
함수 or 블록 안에서 선언돼 그 안에서만 참조 가능

지역변수

지역 유효 범위를 가짐
함수와 같이 블록 내부에서 선언된 변수입니다.
함수의 매개변수 또한 그 함수 내에서 지역변수와 같이 사용됩니다.
변수가 선언된 블록 내부에서만 사용 가능( = 다른 블록에서는 사용 불가)
초기화하지 않을 시 자동으로 쓰레기값 저장
메모리 중 stack 영역에 저장됨
선언과 동시에 생성되며 해당 블록이 끝나는 순간 메모리에서 제거됨
void addTEN(int num); int main() { int n = 10; // 1. main함수 내 지역변수 n // 2. for문 내 지역변수 i for(int i=0; i<n; i++){ printf("."); } addTEN(n); return 0; } // 3. addTEN함수의 지역변수 result + 매개변수 num void addTEN(int num){ int result = num + 10; printf("%d \n", result); }
C
복사

전역변수

전역변수는 함수 외부에 선언된 변수이다
전역 유효 범위를 가진다
즉, 전역변수는 프로젝트 내의 어떤 함수에서도 사용될 수 있다
전역변수는 초기화를 해주지 않아도 자동으로 초기값이 설정
정수형 : 0
문자형 : NULL
실수형 : 0.0
포인터형 : NULL
전역변수는 어디에서도 사용할 수 있어 편리하지만 예상과 다른 값이 저장되어 있다면 어떤 함수에서 수정되었는지 찾기 어렵기 때문에 = 유지보수가 어려워집니다 무조건적인 전역변수 사용은 바람직하지 않습니다
지역변수와 전역변수 중에 이름이 같은 변수가 있다면 지역변수를 우선적으로 접근합니다. 코드가 길어질수록 지역변수와 전역변수의 이름이 겹칠 가능성이 높아지는데, 그렇게 되면 개발자가 의도하지 않았던 결과가 나올 수 있기 때문에 꼭 필요한 경우가 아니라면 지역변수를 사용하는 것이 좋습니다.
한 프로젝트 내에서 다른 파일의 전역변수를 사용하려면 키워드 extern을 사용해 다른 파일의 전역변수를 선언해야 합니다.
#include <stdio.h> // 전역변수 PI와 gi double PI = 3.14; int gi; int main() { double r = 5; //지역변수 r const double PI = 3.141592; // 전역변수 PI와 같은 이름의 지역변수 PI printf("gi : %d\n", gi); // 전역변수 gi 기본값 0 이 출력 printf("PI : %f\n", PI); // 지역변수 PI값 참조 printf("Area : %f\n", getArea(r)); // 전역변수 PI를 참조해 계산된 결과 출력 return 0; } double getArea(double r) { return r*r*PI; // 전역변수 PI를 참조 }
C
복사

정적 변수

처음 메모리에 저장된 이후 제거되지 않고 지속적으로 저장값을 유지
키워드 static을 자료형 앞에 넣어 선언
정적 변수는 초기값을 설정하지 않으면 0 또는 NULL로 자동설정
정적변수는 상수로만 초기화가 가능하며 단 한번만 가능합니다.

레지스터 변수

일반 메모리가 아닌 CPU내의 레지스터에 저장됩니다
레지스터 변수를 선언하기 위해선 키워드 register를 자료형 앞에 넣어 선언하면 됩니다.
레지스터 변수는 지역변수에만 사용할 수 있습니다
레지스터는 CPU내에 존재하므로 일반메모리보다 빠르게 접근이 가능
그러나! 일반 메모리에 저장이 아니므로 주소연산자 &가 사용 불가능

메모리 영역과 변수 이용

메모리영역의 분류

1. data 영역

전역변수와 정적변수가 저장
이 영역에 저장되는 변수는 프로그램이 시작될 때 할당되고 프로그램 종료시 제거

2. heap 영역

동적 할당 변수가 저장
사용자가 직접 관리할 수 있으며 관리해야만 하는 메모리 영역
힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됩니다.
힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다.

3. stack 영역

함수의 매개변수와 함수 내부의 지역변수들이 저장
이 영역에 저장되는 변수는 함수 또는 블록이 시작될 때 할당되고 함수 또는 블록이 종료되면 제거
스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 합니다.
스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출합니다. = 후입선출(LIFO, Last-In First-Out) 방식
스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당됩니다.