Data is ___ !

변수의 종류 

지역변수 

int main()
{
	int g_iLocal = 100;
	return 0;
}

1) 정의 

  • 스택 영역에 저장되는 변수 (즉, main(), Test(), ... 함수 안에서 선언된 변수)
  • 함수 내에서 선언되어 해당 함수에서만 사용할 수 있는 변수  

2) 특징 

  • main() 함수 내에서 `int i = 0;`을 정의했다면 Test() 함수에서 사용이 불가하다. 하지만 Test() 함수에서 `int i = 0;`를 정의해도 오류가 발생하지 않으며 다른 역할로 사용할 수 있다. 
  • 함수가 반환/종료되면 메모리에서 사라진다. 

 

전역변수 

int g_iGlobal = 100;

int main()
{
	return 0;
}

1) 정의 

  • 데이터 영역에 저장되는 변수 (즉, main() 함수 밖에서 선언된 변수) 
  • 해당 파일 어떤 곳에서든 사용할 수 있는 변수 

2) 특징 

  • 모든 함수에서 사용이 가능하다. 하지만 재정의는 불가하다. 
  • 함수가 반환되도 메모리에서 사라지지 않는다. 

 

정적변수(static)

int Test()
{
    static int i = 0;
    int a = 0;
    
    ++i;
    return i;
}

1) 배경 

  • A.cpp 파일 내에서 데이터 영역의 메모리 공간을 사용하고 싶어 전역변수를 정의했다고 했을 때 만약 B.cpp 파일이 A.cpp 파일을 참고해야 한다면 두 파일 모두에서 전역변수가 선언되어 중복정의 문제가 발생한다. 이를 해결하기 위해 나온 변수 

2) 정의 

  • 데이터 영역에 저장되는 변수 

3) 특징

  • static이라는 말처럼 선언된 곳에서만 사용되고 움직이지 않는다. 따라서 정적변수가 선언되는 위치에 따라 변수 이름은 같아도 동작의 차이가 있다. 
  • main.cpp, func.cpp 파일에서 모두 선언되었다고 해도 중복정의 문제가 발생하지 않는다
  • 데이터영역의 메모리 공간을 사용하기 때문에 선언된 파일/함수에서만 전역변수처럼 사용된다고 할 수 있다. 
  • 함수가 호출될 때마다 i의 값은 0으로 초기화되지 않고, 이전 값이 유지된다. (메모리 영역) 즉, 함수 안에 정적변수를 선언한다는 것은 함수가 호출될 때마다 `i=0`을 넣겠다는 것이 아니라 Test()에서만 접근 가능한 데이터 영역에 만들어진 정적변수의 초기값을 0을 주겠다는 것이고 이후 부터는 초기화 구문이 실행되지 않는다. 최초 한번만 실행 ! 단, 지역변수 a는 Test() 호출마다 0으로 초기화된다. (스택 영역)

4) 언제 사용하면 좋을까 ? 

  • 해당 변수의 접근이나 기능을 제한하고 싶을 때
  • 데이터 영역을 사용하는 전역변수의 역할을 하고 싶은데 다른 파일과 `#include` 관계가 있을 때 중복정의 문제가 발생하므로 이를 방지하고 싶을 때
  • 정적변수를 함수 안에 썼을 때에는 그 함수 안에서만 함수의 호출과 종료에 상관없이 프로그램 실행 내내 유지시킬 수 있는 변수를 만들고 싶을 때

 

외부변수(extern)

// common.h 파일
extern int g_iExtern;

// func.cpp 파일
#include "common.h"
#include "func.h"
int Add(int a, int b)
{
    printf("g_iExtern의 값은 : %d", g_iExtern);
    return a + b;
}

// main.cpp 파일
#include "common.h"
#include "func.h"
int main() 
{
    g_iExtern = 500;
    Add(10, 20);
    return 0;
}

1) 배경

  • 전역변수의 문제 : 하나의 파일에 전역변수를 설정하고, `#include`를 하면 이를 참조하는 모든 파일에 전역변수가 선언되서 중복정의 문제 발생
  • 정적변수의 문제 : 중복정의 문제는 발생하지 않지만 기능을 통합하는 하나의 변수를 만드는 것이 아니라 각 파일별로 변수가 따로 쓰임 

2) 정의

  • 데이터 영역에 저장되는 변수 

3) 주의해야 할 점 

  • extern 변수를 배치할 때 common.h 파일 내에서 `extern int g_iExtern=0;` 처럼 초기화를 먼저 하면 안된다. 초기화를 해버리면 전역변수처럼 중복정의 문제가 발생한다. 따라서 변수를 선언하는 것이 아니라 변수가 있다고만 알려주는 역할을 하는 `extern int g_iExtern;`을 먼저 사용한다. 
  • 또한 있다고만 알려주고 초기화를 하지 않으면 안된다. main.cpp 파일에서 `g_iExtern = 500;`이라고 변수 값을 변경하고 있고, func.cpp 파일에서는 g_iExtern 값을 프린트하고 있는데 초기화된 변수가 없으면 링크 단계에서 오류가 발생한다. 초기화 위치는 링크 단계에서 파일들이 하나로 취합되기 때문에 어떤 파일에 있어도 상관없다. 

4) 언제 사용하면 좋을까 ? 

  • 데이터 영역을 사용하면서 & 중복정의 문제가 없으면서 & 파일별로 참조하고 싶은 변수가 있을 때 

 

 

 

메모리 영역

1) 스택 영역

  • 지역변수들이 사용하는 메모리 영역 (함수가 호출될 때 사용하는 영역) 

2) 데이터 영역

  • 프로그램 시작 시 생성, 프로그램 종료 시 해제 

3) 읽기 전용 (코드, ROM)

4) 힙 영역

 

 

 

 

 

변수와 메모리 영역의 관계 

지역변수(스택영역)와 전역변수(데이터 영역)의 관계 

 

정적변수의 파일별 관계

 

 

외부변수의 파일별 관계

 

'Programming > C++' 카테고리의 다른 글

[C++] Visual Studio 단축키, 디버깅  (0) 2025.06.03
[C++] 분할구현  (0) 2025.06.03
[C++] 구조체  (0) 2025.06.03
[C++] 배열  (0) 2025.06.01
[C++] 반복문(for, while) | 함수(w/ 재귀함수)  (0) 2025.06.01
profile

Data is ___ !

@콩순이컴퓨터

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...