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 |