본문 바로가기

진리는어디에/C++

[C++] 전역 변수 extern 키워드

extern 키워드는 '여기서는 선언만 한다. 그 내용은 어딘가에 정의 되어 있다.' 라는 의미를 가지는 키워드 이다.
여기서 '선언'과 '정의'의 개념을 잠깐 살펴보기 전에 함수를 먼저 떠올려 보자.

예를 들어

int sum(int a, int b);
 
int main()
{
    std::cout << sum(10, 20) << std::endl;
}

int sum(int a, int b) 
{
    return a+b;
}

위와 코드에서 1라인은 이러이러한 함수가 있다고 하는 함수 선언, 8라인은 앞에서 선언한 함수가 어떠한 일을 하게 됨을 정의 하는 함수 정의. 그리고 5라인은 그 함수를 사용하는 호출이라고 한다.

이런식으로 어딘가에 이런 변수가 정의 되어 있고 여기서는 단지 선언만 할 뿐이다...라고 할 경우에는 extern을 사용한다. 보통은 header파일에 extern 키워드를 사용하고, 다른 c/cpp 파일에서 정의를 해준다. 하지만 주의 사항은 정의를 여러곳에서 해서는 안된다는 것이다. 그리고 extern 변수는 전역으로 선언되어져야 한다.

아래의 코드를 살펴 보자. 두 개의 cpp파일이 있고 각 파일의 전역변수들을 다른 파일에서도 사용 할 수 있게끔 하려는 코드다.

extern_exam.h

#ifndef __TEST_EXTERN_H__
#define __TEST_EXTERN_H__

int setA100();
int setB200();

#endif

extern_exam.cpp

#include "extern_exam.h"

extern int a;     //a 라는 변수는 이 파일에는 없지만 어딘가에 정의 되어 있음을 의미
int b = 100;      // b 라는 변수 정의, 100으로 초기화
int setA100() {
    a = 100;
}

extern_main.cpp

#include "extern_exam.h"
#include <iostream>

int a = 200;   // extern_exam.cpp에서 extern으로 선언된 변수가 여기에서 정의, 200으로 초기화
extern int b;
int setB200() {
    b = 200;
}

int main() {
    setA100();
    std::cout << a << std::endl;
    setB200();
    std::cout << b << std::endl;
    return 0;
}

 위의 세개의 파일을 컴파일 해보도록 하자.
 g++ extern_exam.cpp extern_main.cpp(Visual Studio 라면 같은 프로젝트에 넣고 컴파일/링크 하면 된다.)

 위와 같이 하고 난뒤에 결과 값은 알아서 상상하도록...상상이 안된다면 직접 컴파일하고 결과값을 살펴 보는 것도 괜찮다. 결과를 살펴 볼때 유의 깊게 살펴 볼것은, 파일내에 정의 되어 있지 않은 전역 변수가 변화 되었다는것 정도..?

 extern의 사용 시기에 대한 설명들은 다른 웹페이지에 수도 없이 기제 되어 있으므로 다른 웹페이지들도 참고 할것~!

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!