소년코딩

04.04 - 전역 변수가 나쁜 이유 (Why global varibles are evil)

만약 베테랑 프로그래머에게 좋은 프로그래밍에 대해 충고를 하나 부탁하면, 몇 가지 중에서 가장 자주 듣는 말은 "전역 변수를 피하라!"일 것이다. 전역 변수는 가장 남용 되는 개념 중 하나다. 작은 프로그램에는 해가 없는 것처럼 보이지만 큰 프로그램에서는 종종 문제가 된다.

초보 프로그래머는 대게 함수와 관련되어 있을 때, 매개 변수를 통한 값 전달이 고통스러우므로 전역 변수를 사용하려는 경우가 많다. 그러나 이것은 나쁜 습관이다. 비-상수(non-const) 전역 변수는 완전히 피하는 게 좋다.

전역 변수가 나쁘다고 말하면 모든 전역 변수가 나쁜 것은 아니다. 주로 비-상수(non-const) 전역 변수가 나쁘다.


왜 (non-const) 전역 변수가 나쁠까?

const가 아닌 전역 변수 사용 나쁜 큰 이유는 호출되는 함수에 의해 값이 변경될 수 있기 때문이다. 프로그래머는 값이 변경됬다는 것을 알아차리기 쉽지 않을 수 있다.

// 전역 변수 선언
int g_mode;

void doSomething()
{
    g_mode = 2; // 전역 변수 g_mode의 값을 2로 설정한다.
}

int main()
{
    g_mode = 1; // 지역 변수 g_mode가 없기 때문에 전역 변수 g_mode의 값을 1로 설정한다.

    doSomething();

    // 프로그래머는 전역 변수 g_mode의 값이 1이라고 생각할 수 있다.
    // 그러나 doSomething() 함수가 g_mode 값을 2로 바꾸었다.

    if (g_mode == 1)
        std::cout << "No threat detected.\n";
    else
        std::cout << "Launching nuclear missiles...\n";

    return 0;
}

프로그래머가 g_mode를 1로 설정한 다음 doSomething() 함수를 호출했다. doSomething() 함수가 g_mode 값을 2로 설정한다는 기능을 알고 있지 않다면 main() 함수의 나머지 부분은 프로그래머가 기대하는 것처럼 작동하지 않을 것이다.

const가 아닌 전역 변수는 모든 함수를 잠재적으로 위험하게 만든다. 그리고 프로그래머는 어떤 변수가 위험하고 어떤 변수가 위험하지 않은지를 쉽게 알 방법이 없다! 지역 변수는 다른 함수에 직접 영향을 미치지 않으므로 훨씬 안전하다.

또한, 전역 변수는 어디서나 사용할 수 있으므로 변수의 의미를 이해하려면 상당한 양의 코드를 검토해야 한다. 지역 변수를 가능한 한 가까운 곳에 사용하도록 선언하는 이유 중 하나는 변수의 기능을 이해하기 위해 검토해야 할 코드 양을 최소화하기 때문이다.

예를 들어, g_mode 변수가 코드 442번 줄에 정의되었다고 가정하자. g_mode가 제대로 문서화되어 있지 않은 경우, 여러 가지 경우에 사용되는 방법, 유효한 값 및 전체 기능을 이해하기 위해 모든 g_mode 변수의 사용을 검토해야 한다.

전역 변수의 사용을 최소화하고, 전역 변수 대신 지역 변수를 사용해서 함수에 전달하자.


그렇다면 언제 전역 변수를 사용하는게 좋을까?

많지 않지만 어떤 경우에는 전역 변수를 사용하면 프로그램의 복잡성을 줄이고, 드물게 다른 변수보다 더 좋을 수 있다.

예를 들어, 프로그램에서 데이터베이스(database)를 사용해서 데이터를 읽고 쓰는 경우, 데이터베이스를 전역 변수로 선언하는 게 좋다. 마찬가지로 프래그램의 오류정보를 덤프할 수 있는 오류 로그가 있는 경우에는 로그 하나만 가지고 있고 어디서나 사용할 수 있으므로 전역으로 정의한다. 사운드 라이브러리 또한 좋은 예다. 사운드 라이브러리를 필요로 하는 모든 함수에 전달하고 싶지 않을 것이다. 소리를 관리하는 사운드 라이브러리가 하나뿐이라면 전역 변수로 선언하고 프로그램이 시작할 때 초기화한 다음 읽기 전용으로 처리하는 게 좋다.


cpp 번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/4-2a-why-global-variables-are-evil/ 입니다.

댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기