-
지역 변수
지역 변수는 함수 내부에서 선언되고 사용되는 변수
- 함수 또는 블록 내부에서 선언된다. 선언된 블록 내에서만 접근 가능
- 메모리의 스택에 저장된다. 코드 블럭의 끝 지점을 만나면 해제된다.
- 선언된 함수, 블록 내에서만 접근 가능.
- 지역 벽수는 자동으로 초기화 되지 않는다.
#include <iostream> void exampleFunction() { int localVar = 5; // localVar is a local variable std::cout << "Local variable value: " << localVar << std::endl; } int main() { exampleFunction(); // localVar cannot be accessed here, as it's limited to the scope of exampleFunction() return 0; }
전역 변수
전역 변수는 프로그램의 전체 영역에서 접근이 가능한 변수
- 함수 외부에서 선언된다.
- 전역 변수는 DATA 영역에 저장된다. (초기화 되면 DATA, 아니면 BSS)
- 프로그램의 시작부터 종료까지 메모리에 유지되고, 종료될 때 해제된다.
- 프로그램의 모든 함수, 클래스에서 접근 가능하다.
- 명시적으로 초기화되지 않으면 컴파일러에 의해 자동으로 0 또는 nullptr로 초기화된다.
- 다른 소스 파일에서도 접근할 수 있다. 'extern' 키워드를 사용해야함.
#include <iostream> int globalVar = 10; // globalVar is a global variable void displayGlobalVar() { std::cout << "Global variable value: " << globalVar << std::endl; } int main() { displayGlobalVar(); // Global variable value: 10 globalVar = 20; displayGlobalVar(); // Global variable value: 20 return 0; }
정적 변수
정적 변수는 프로그램 실행 동안 값이 유지되는 변수
- 함수 또는 클래스 에서 선언될 때 해당 함수나 클래스에서만 접근 할 수 있다.
- 프로그램 전체 실행 시간 동안 존재하며, 초기화 되는 시점에 메모리가 할당되고 종료시 해제된다.
- 명시적으로 초기화하지 않으면 자동으로 0으로 초기화된다. 변수 선언 시점에 단 한 번만 이루어진다.
- 함수 호출 사이에서 값을 유지한다. 함수 종료 후에도 메모리에 유지되기에 다음 함수 호출에도 이전 값이 그대로 사용된다.
- 전역 변수화 함께 저장되며, 프로그램의 실행 시간 동안 메모리가 유지된다. (BSS or DATA 영역)
- 사용범위에 따라 정적 지역변수, 정적 전역변수로 나뉜다.
#include <iostream> // 정적 전역 변수 정의 static int static_global_var = 0; void increment() { // 정적 지역 변수 정의 static int static_local_var = 0; static_local_var++; static_global_var++; std::cout << "정적 지역 변수: " << static_local_var << std::endl; std::cout << "정적 전역 변수: " << static_global_var << std::endl; } int main() { increment(); // 첫 번째 호출 increment(); // 두 번째 호출 increment(); // 세 번째 호출 return 0; }
#include <iostream> class ExampleClass { public: static int staticVar; // 클래스 내부의 정적 변수 }; int ExampleClass::staticVar = 10; // 정적 변수 초기화 int main() { ExampleClass obj1; ExampleClass obj2; std::cout << "Static variable in obj1: " << obj1.staticVar << std::endl; // Static variable in obj1: 10 std::cout << "Static variable in obj2: " << obj2.staticVar << std::endl; // Static variable in obj2: 10 obj1.staticVar = 20; std::cout << "Static variable in obj1: " << obj1.staticVar << std::endl; // Static variable in obj1: 20 std::cout << "Static variable in obj2: " << obj2.staticVar << std::endl; // Static variable in obj2: 20 return 0; }
동적 변수
프로그램 실행 도중 동적으로 메모리를 할당 받아 사용하는 변수
- 메모리 힙 영역에 할당된다.
- 포인터에 접근하며, 메모리 할당과 해제에 포인터를 사용한다.
- 생명주기는 메모리가 할당된 시점부터 'delete' 연산자를 사용하여 명시적으로 해제될 때 까지이다.
- 동적 변수가 해제되지 않은 상태에서 포인터가 덮여쓰여지거나 범위를 벗어나면, 메모리 누수가 발생할 수 있다.
#include <iostream> int main() { int* dynamicVar = new int; // 동적 변수 할당 *dynamicVar = 42; // 동적 변수 초기화 std::cout << "Dynamic variable: " << *dynamicVar << std::endl; // Dynamic variable: 42 delete dynamicVar; // 동적 변수 메모리 해제 dynamicVar = nullptr; // 포인터 초기화 return 0; }