포스트

외부 변수와 extern, 그리고 외부 링크

외부 변수란?

외부 변수(external variable)란, 지역 변수와 반대의 의미로, 모든 함수의 외부에 있는 변수를 말합니다.

즉, 모든 함수에서 이름으로 액세스 할 수 있는 변수(전역 변수)를 말합니다.

참고: 지역 변수, 전역 변수, 정적 변수, 동적 변수

extern 키워드는?

extern 키워드는 전역 변수를 다른 파일에서 사용하기 위해 사용하는 참조 선언입니다.

즉, extern외부에 선언 및 정의가 되어있는 변수를 참조하라는 의미로, 다른 소스 파일에서 정의된 변수를 참조합니다.
(당연히 extern 으로 선언된 변수를 초기화할 수 없습니다)

extern 키워드는 함수의 선언에도 사용될 수 있으며, 해당 함수가 다른 소스 파일에서 정의되어 있다는 의미로 쓸 수 있습니다.

만약 extern 없이 같은 변수명을 사용하게 된다면, 중복된 이름 사용으로 인해 단일 변수 정의 규칙에 위배됩니다.

단일 변수 정의 규칙(Single Variable Definition Rule)이란, 프로그래밍에서 변수를 정의할 때 사용되는 규칙 중 하나로, 특정 변수의 정의가 프로그램 내에서 단 한 번만 나타나야 함을 의미합니다.

1. 변수 선언

extern 키워드는 다른 파일에서 정의된 전역 변수를 현재 파일에서 사용하기 위해 선언할 때 사용됩니다.
(변수의 선언은 컴파일러에게 변수의 타입과 이름을 알려주는 것이고, 정의는 실제로 메모리를 할당하는 것입니다.)

1
2
3
4
5
// externVar.cpp
int globalVar = 123; // 전역 변수 정의

// other.cpp
extern int globalVar; // 전역 변수 선언

2. 함수 선언

extern함수의 선언에도 사용될 수 있으며, 함수가 다른 소스 파일에 정의되어 있음을 나타냅니다.

1
2
3
4
5
6
7
// externFunc.cpp
void myFunction()
{
	//...
}
// other.cpp
extern void myFunction(); // 함수 선언

예제

예를 들어, 한 소스 파일에서 전역 변수를 정의하고 다른 소스 파일에서 해당 변수를 사용하려면, 다른 파일에서 extern 키워드를 사용하여 해당 변수를 선언해야 합니다.

1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;

int globalVar = 123; // 전역 변수 선언/정의

void printGlobalVar() 
{
    cout << "globalVar in externVar.cpp: " << globalVar << endl;
}

externVar.cpp

1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;

extern int globalVar; // externVar.cpp 에서 정의된 전역 변수 선언

void printGlobalVarFromAnotherFile() 
{
    cout << "globalVar in externFunc.cpp: " << globalVar << endl;
}

externFunc.cpp

1
2
3
4
5
6
7
8
extern void printGlobalVar(); // externVar.cpp 에서 정의된 함수 선언
extern void printGlobalVarFromAnotherFile(); // externFunc.cpp 에서 정의된 함수 선언

int main() 
{
    printGlobalVar();
    printGlobalVarFromAnotherFile();
}

main.cpp

결과 결과

이런 식으로 externFunc.cpp에서 globalVar 변수를 마치 해당 파일 내에서 정의된 것처럼 사용할 수 있습니다.

이렇게 extern을 사용하면 코드의 모듈화와 재사용성을 높일 수 있으며, 프로젝트의 여러 파일 간에 변수와 함수를 효율적으로 공유할 수 있습니다.


외부 링크 정적 변수 (External Linkage Static Variables)

외부 링크 정적 변수란, 모든 함수의 외부에서 선언되고 프로그램의 여러 파일(외부 파일)에서 접근할 수 있는 변수를 말합니다.

이러한 변수는 하나의 소스 파일에서 정의되고, 다른 소스 파일에서 extern 키워드를 사용하여 선언될 수 있습니다.

여기에서 링크는 식별자의 접근 범위와 연결 방식을 말하는데, 외부 링크란, 해당 파일 외부인 프로그램 전체를 접근 범위로 가지는 연결 방식을 뜻합니다. (프로그램 전체에서 접근할 수 있는 식별자 입니다.)

이때, 정적 변수 라는 용어가 혼란스러울 수 있는데, 여기에서의 정적(Static)저장 기간을 의미하며, 변수가 프로그램의 수명 주기 동안 지속됨을 나타냅니다.

즉, 프로그램 전체에서 접근할 수 있고 프로그램의 수명 주기 동안 지속되는 변수인, 전역 변수를 뜻합니다.

내부 링크 정적 변수 (Internal Linkage Static Variables)

내부 링크 정적 변수란, 해당 파일 내에서만 접근 가능한 정적 변수입니다.

즉, 모든 함수 외부에서 선언하되, 정적(Static) 기억 공간 제한자를 붙인 변수입니다.

여기에서 링크는 식별자의 접근 범위와 연결 방식을 말하는데, 내부 링크란, 해당 파일 내부를 접근 범위로 가지는 연결 방식을 뜻합니다.

따라서, 현재 파일 내에 존재하는 모든 함수들이 데이터를 공유하기 위해 사용하며, 사용 범위가 현재 파일로 제한되어 다른 파일에서도 중복된 이름을 가질 수 있습니다.

링크가 없는 정적 변수 (No Linkage Static Variables)

링크가 없는 정적 변수란, 블록 내에서만 접근 가능한 변수이면서, 정적 변수의 활동 시간을 가지는 변수입니다.

특정 함수 또는 블록 내에서 static 제한자를 붙여 선언됩니다.

정리하면, 범위 내에서만 접근 가능하지만, 해당 범위가 종료되어도 메모리에서 제거되지 않고 값을 유지되는 변수입니다.


참고

지역 변수, 전역 변수, 정적 변수, 동적 변수

[static 키워드] 01_전역 정적 변수와 지역 정적 변수

[static 키워드] 02_정적 멤버 변수

[static 키워드] 03_정적 멤버 함수

이 기사는 저작권자의 CC BY-NC-ND 4.0 라이센스를 따릅니다.