본문 바로가기
공부/C, C++

[C] 변수(지역 변수, 전역 변수, 정적 변수, 외부 변수)

by 김샤랑 2022. 1. 2.

[C] 변수 (지역 변수, 전역 변수, 정적 변수, 외부 변수)


목차

 변수의 종류

   1. 지역 변수

   2. 전역 변수

   3. 정적 변수

   4. 외부 변수


 메모리 영역

 1. 스택 영역

 2. 데이터 영역

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

 4. 힙 영역


1. 지역 변수

지역 변수는 스택 영역에 선언돼서 함수가 끝나면 사라진다.

#include <stdio.h>

// 전역변수 
int i=0;  // Data 영역 

int main()
{
  // 지역변수
  return 0;
}
int iName =0;

//괄호 안에 선언된 변수(함수, 지역) 
{
 int iName = 100;
 iName;   // 괄호 지역 안에 선언했던 iName 
}

iName = 100;  // 바깥쪽에 선언했던 iName

// 지역과 지역 안에 또 지역을 만들 수 있다. 
// 괄호 안의 iName과 밖의 iName은 다른 변수이다.

2. 전역 변수

함수 바깥의 변수. Data 영역에 있다.

 

Data 영역 특징

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

전역 변수이지만 여러 파일이 있을 때 거기서 모든 파일들에서 공유 하는 전역 변수는 단순히 만들 수 없다. 아래를 더 읽어보자.


이전 분할 구현 포스팅에서 흐름이 이어진다. (링크 첨부)

 

전역 변수를 모든 cpp 파일에서 인식하게 사용하고 싶다.

-> 어떻게?


3. 정적 변수(static)

정적 변수는 static이라는 키워드가 붙는다. 전역 변수처럼 데이터 영역을 쓴다.(프로그램이 끝날 때까지 계속 살아있다.) 

static int g_i = 0;

그러면 전역 변수와 정적 변수의 차이는 무엇일까?

 

- 움직이지 않는다. 틀어박혀서 나오지 않는다. 

 

  • 전역 변수 위치에 정적 변수를 쓰면?

-> 파일(cpp) 안에 선언된 변수이다. 각자 선언된 곳에서 틀어박혀있다. 

->그래서 처음 전역 변수라서 생긴 문제가 정적 변수로는 문제가 발생하지 않는다. 전역 변수의 naming 문제를 일으키지 않는다.

-> 각각의 파일에 같은 이름 static 변수라도 파일이 달라서 에러가 생기지 않는다. (구별이 가능해짐)

 

  • 한 함수 내에 정적 변수를 쓰면?

-> 정적 변수는 그 함수 내에서 안 움직인다. 그런데 메모리 영역은 데이터 영역에 있다. 그 함수가 종류 될 때 스택 메모리에 있는 게 아니라 함수가 끝나고 사라질 때도 계속 남아있다. 생겼다 사라졌다 하지 않고 계속 유지. 그러나 다른 곳에서는 못씀. 다른 데서 접근해서 못씀.

 

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

Q: 어 그러면 static을 Test함수가 돌 때마다 새로 선언해서 값이 커질 수 있는 거 아닌가?

A: static 문법이다. C++ 문법 기준 static 변수 초기화문은 최초에 한번 수행되고 그 뒤로는 건너뛴다. 

 

- 얘도 완벽한 전역 변수를 만들 순 없다.


4. 외부 변수(extern)

extern은 헤더 파일에 넣을 때 초기값을 넣어선 안된다. (extern int g_iExtern= 0;)

extern int g_iExtern; 까지만 쓰면 이런 애가 있다... 까지만 알 수 있다. (값은 모름)

 

  • 초기 화문을 사용하면 안 되고, 있다 까지만 알린다.
  • 드디어 우리가 원했던 전역 변수를 만들 수 있다! 

다른 cpp 파일에서 값을 넣어 사용하면 된다. (iExtern = 0;)

'공부 > C, C++' 카테고리의 다른 글

[C] 포인터 Pointer  (0) 2022.01.03
[C] 구조체  (0) 2022.01.02
[C] 분할 구현  (0) 2022.01.02
[C] 배열  (0) 2022.01.01
[C] 재귀 함수(2), 피보나치 수열  (0) 2022.01.01

댓글