|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
변수는 함수 외부에 선언될 수 있다. 이러한 변수를 전역 변수(global variables)라 부른다. 예를 들면, 다음 코드에서 g는 전역변수이다. 여러분은 fun() 내부에 선언된 n은 지역변수임을 알고 있다. 전역 변수는 지역 변수와는 달리, 이 변수가 선언된 이 후에 정의되는 모든 함수에서 별도의 선언 없이 사용될 수 있다. 따라서 전역 변수가 프로그램의 첫 부분에 선언된 경우에는, 프로그램 전체에 걸쳐서 사용 가능하다. 변수가 사용될 수 있는 프로그램의 영역을 변수의 영역(scope)이라 부른다. 따라서 지역 변수의 영역은 이 변수가 선언된 함수 내부가 되며, 전역 변수의 영역은 이 변수가 선언된 이후의 프로그램의 모든 영역에 해당된다.
프로그램의 첫 부분에 선언된 변수 a는 함수 외부에서 선언되었기 때문에 전역 변수이다. main()과 fun()은 각각 자신의 지역 변수 b가 선언되어 있다. 두 함수의 지역 변수가 이름이 같지만, 그 영역이 함수 내부에 제한되기 때문에 문제가 되지 않는다. 또한, fun()에서 a를 참조하고 있다. a가 fun()에서 선언되어 있지 않기 때문에 오류가 발생하는가? 그렇지 않다. a는 전역 변수이고, 따라서 그 영역은 프로그램 전체이고, 프로그램에 포함된 어떤 함수에서도 올바르게 참조 가능하다. 프로그램 15-2 실행 과정을 전역변수와 지역 변수간의 차이를 살펴보자. 프로그램 실행은 다음과 같이 4단계로 구분된다.
|
전역 변수를 프로그램 첫 부분에 선언하면, 프로그램의 어느 곳에서도 이 전역변수를 참조할 수 있다. 따라서 전역 변수를 사용하면 함수에 매개변수를 전달할 필요도 없어진다. 다음은 전역 변수를 사용한 함수간의 인터페이스를 보여준다. 함수 A가 B에 값을 어떻게 전달할 수 있는가? 이것은 함수 A는 전달하고자 하는 값을 전역 변수 g에 설정하고, 함수 B는 이 전역 변수를 참조함으로써 가능하다. 위의 그림에서 오른쪽 방향 화살표를 클릭하시오. 반대로, 함수 B가 호출자에게 값을 반환하는 것도 가능하다. 이것은 함수 B가 g에 값을 변경하고, 함수 A가 g를 참조함으로써 가능하다. 위의 그림에서 왼쪽 방향 화살표를 클릭하시오. 다음은 지역 변수를 통한 함수간의 인터페이스를 보여준다. 이것은 지금까지 여러분이 매개변수를 통해서 함수간의 인터페이스를 표현해온 방식이다. 프로그램 15-2는 전역 변수 a를 통해서 main()과 fun()의 두 함수간에 인터페이스를 표현하고 있음을 알 수 있다. 이 프로그램에서 a가 main()의 지역 변수인 경우에도, fun()의 실행 중에 a에 영향을 미치고자 한다면 어떻게 표현할 수 있는가? 여러분은 다음 프로그램과 같이 fun()에게 a를 매개변수로 전달하고, fun()으로부터 변경된 a를 반환받는 것을 생각할 수 있다. ![]() 프로그램 15-2와 15-2-1을 비교해보라. 프로그램 15-2가 작성하기 더 간편하고, 함수간에 데이터가 전달되지 않기 때문에 더 효율적이다. 그렇다면, 전역 변수를 사용하여 함수간의 인터페이스를 표현하는 것이 바람직한가? 변수에 잘못된 값이 포함되어 발생한 오류를 탐지하고 있다고 가정해보자. 만약, 이 변수가 전역 변수라면, 프로그램에 포함된 모든 함수가 이 변수를 참조할 수 있으며, 따라서 여러분은 오류를 탐지하기 위해서 프로그램 전체를 살펴보아야 할 것이다. 프로그램이 복잡하고 규모가 큰 경우에 이러한 디버깅 작업은 상당한 노력과 시일이 걸릴 것이다. 그러나 해당 변수가 지역 변수라면, 오류를 찾기 위해서 단지 그 변수를 포함하는 한 개의 함수만을 살펴보면 될 것이다. 앞서 살펴보았듯이, 전역 변수의 사용은 프로그램 오류 발생시에 그 원인을 찾아내는 과정이 매우 어렵다. 또한, 그 원인을 찾아냈다 하더라도 오류를 해결하는 과정도 어렵다. 왜냐하면, 전역 변수가 포함된 코드의 수정은 이 전역 변수를 참조하는 다른 모든 함수에 영향을 미치기 때문이다. 이러한 문제점을 해결하기 위해서, 전역 변수를 가급적으로 사용하지 않는 것이 바람직하다. 따라서
함수간의 인터페이스를 위해서 전역 변수보다는 매개변수를 사용하여 수행하는 것이 훨씬 더 나은 방법이다. 3. 예제 프로그램 전역 변수는 지역 변수와는 달리 함수 호출간에 값을 유지하며, 프로그램의 내부 상태(internal state)를 표현하는데 적합하게 사용될 수 있다. 전역 변수를 유용하게 사용할 수 있는 다음 문제를 생각해보자.
|
|
|
|