c++/기초

extern (외부 변수)

코드망령 2026. 6. 5. 09:33

extern (외부 변수)

현재 파일이 아닌 다른 파일에 존재하는 변수나 함수를 참조하기 위한 키워드


외부 변수란?

현재 파일의 코드 외에

다른 파일에 존재하는 변수를 의미한다.

 

예)

// A.cpp

int a = 10;
// B.cpp

extern int a;

B.cpp에서는 실제 변수는 없지만

extern을 통해

"어딘가에 존재하는 변수 a를 사용하겠다"

라고 컴파일러에게 알려주는 것이다.


사용 예제

변수 정의

// A.cpp

int a = 10;

변수 참조

// B.cpp

extern int a;

void Func()
{
    a = 20;
}

문법적으로 아무 문제가 없다.


extern의 동작 방식

컴파일 단계

extern int a;

컴파일러는

"어딘가에 int형 변수 a가 존재한다고 가정"

하고 코드를 컴파일한다.

따라서 실제 변수의 존재 여부를 검사하지 않는다.

즉,

extern int a;

만 있어도 컴파일은 성공한다.


링크 단계

컴파일이 끝나면 링커(Linker)가

실제로 변수 a가 존재하는지 확인한다.

예)

// A.cpp

int a = 10;

존재한다면

extern int a;

와 연결하여 정상적으로 실행된다.


링크 오류 발생 예제

// B.cpp

extern int a;

void Func()
{
    a = 20;
}

그런데

// A.cpp

// int a = 10;

처럼 실제 변수가 존재하지 않는다면

컴파일은 성공하지만

링크 단계에서

unresolved external symbol

오류가 발생한다.


왜 컴파일은 성공할까?

컴파일러는 현재 파일만 본다.

extern int a;

를 보면

"다른 파일에 정의되어 있겠지"

라고 생각하고 넘어간다.

실제 존재 여부는 컴파일러가 아니라

링커가 검사한다.


extern 변수의 메모리

extern int a;

는 새로운 변수를 생성하지 않는다.

즉,

extern int a;

int a;

와 다르다.


변수 생성

int a = 10;
  • 메모리 생성
  • 저장 공간 할당

extern 선언

extern int a;
  • 메모리 생성 안 함
  • 저장 공간 할당 안 함
  • 이미 존재하는 변수를 참조

extern 함수

함수도 동일하게 사용할 수 있다.

// A.cpp

void Print()
{
}
// B.cpp

extern void Print();

int main()
{
    Print();
}

다만 함수는 기본적으로 외부 연결(External Linkage)을 가지므로

대부분의 경우 extern을 생략해도 된다.

void Print();

와 동일하게 동작한다.


정리

extern

다른 파일에 존재하는 변수나 함수를 참조하기 위한 키워드이다.

extern int a;
  • 새로운 변수를 생성하지 않음
  • 메모리를 할당하지 않음
  • 다른 파일의 변수를 참조만 함

컴파일 단계에서는

extern int a;

만 있어도 통과한다.

하지만 링크 단계에서 실제 변수 정의를 찾지 못하면

unresolved external symbol

오류가 발생한다.

즉,

  • 컴파일러 → 문법 검사
  • 링커 → 실제 정의 연결

을 수행한다고 이해하면 된다.

'c++ > 기초' 카테고리의 다른 글

const  (0) 2026.06.08
값 타입과 참조타입  (0) 2026.06.08
분할 구조 (Header / Source File)  (0) 2026.06.05
nullptr  (0) 2026.06.05
#define 0 NULL  (0) 2026.06.02