아마, 이 글이 올라갈 시점에는, 저는 부산의 해운대에 가 있을 듯 싶습니다. 이 글은 예약글이기 때문입니다. 오늘은 잠깐 전역변수에 대해서 간단하게 다뤄보겠습니다. 사실, 별로 안 좋다고 언급하긴 합니다만, ps를 하면, 안 쓸 수는 없는 친구입니다. 그걸 안 쓰면, 매개변수를 더 넘겨주고, 귀찮은 처리 몇 번 더 해야 하기 때문입니다.

 

 


 예제 프로그램을 보도록 하겠습니다.

 

 

 먼저 a는 main 함수 바깥에 선언되어 있습니다. 이 a는 어디에서든 접근할 수 있어요. 그리고 f와 g를 main 함수에서 호출한 다음에, a 값을 출력합니다. 이 때, a 값은 전역 변수 a 값입니다.

 

 

 f와 g 함수는 위와 같습니다. f에는 a를 선언하지는 않았습니다. 그런데 g에는 매개변수로 a를 넘겼습니다. 그리고 19번째 줄에, a 값을 출력합니다.

 

 

 실행 결과는 2, 1이 나옵니다. 이게 어떻게 나온 것인지 차근 차근 보도록 하겠습니다.

 

 


 먼저, 전역 변수인 a가 메모리에 올라갑니다.

 

 

 다음에 f가 호출이 됩니다. 이 때에는 아무런 매개변수도 없어요. 그런데 어떻게 a에 접근할까요? a가 global하게 선언이 되어 있기 때문에, f에서도 보라색으로 칠한 a에 접근할 수 있습니다. 14번째 줄에 있는 a++을 수행하면, 보라색으로 칠한 a값은 1이 됩니다.

 

 

 다음에 g를 호출할 건데요. 여기서, a 값을 인자로 넘깁니다. 이것을 매개변수 a로 받는데요.

 

 

 값 복사가 되어서 넘어갑니다. 이 때 노란색 a는 스택 영역에 있습니다. 즉, g가 호출이 될 때 생기고, g가 끝났을 때, 메모리에서 사라지는 변수입니다.

 

 

 그러면 g 함수에서 a는 어떤 것을 의미할까요? 바깥에 있는 a? 아니면 매개변수로 넘어온 지역변수 a? 답은 후자입니다.

 

 

 g 입장에서는 바깥에 있는 a는 안 보입니다. visible 하지 않다는 것입니다. 따라서, 노란 부분의 a가 하나 증가합니다. 더 정확히 말하면, 현재 실행중인 큰 블록이, h 함수였는데요. 그 안에 지역 변수 a가 있었습니다. 따라서, a가 보였던 셈입니다. 음. 이 부분 헷갈릴 수 있으니, 작은 예제 하나만 더 보겠습니다.

 

 

 main 함수에서 g를 호출한 경우 어떤 일이 벌어질까요? 일단, 17번째 줄 a++은 이해하기 그리 어렵지 않습니다. 24번째 줄 a는 어떤가요? 큰 블록이 h 함수입니다. 이 안에 a라는 변수가 있나요? 네. 있습니다. 가장 가까이에 있는 것이 22번째 줄에 선언된 지역 변수 a입니다. 따라서, a가 하나 증가합니다.

 

 

 

 이 경우는 어떨까요? 중괄호 블록 기준으로 봅시다. 그러면, 가장 가까운 중괄호가 22번째, 21번째 줄 순입니다. h 함수 어디에도 지역변수, 매개변수 a가 없습니다. 따라서 전역으로 선언되어 있는 a에 접근합니다.

 

 이걸 보기 쉽게 도식화 시키면 위 그림과 같아요. h 어디에도 a가 없기 때문에 제일 바깥 블록에 있는 전역 a에 접근한다는 것을 알 수 있어요. 이제 예제 프로그램 1의 19번째 줄로 돌아가 보겠습니다.

 

 a값을 printf 하라고 했습니다. g 안에서 a값은 매개 변수 a를 의미합니다. 따라서 노란색 a를 출력합니다. 이 때에는 노란색 a가 출력되므로 2가 print 될 겁니다. 다음에, g가 끝나면, 노란색으로 칠해진 a는 메모리에서 사라집니다. 사실 완벽하게 사라지는 건 아닙니다만, 쓸모 없어집니다.

 

 

 그러면, 이 때 a값을 출력하라고 하면 1이 출력될 거에요. 그러면 h도 보라색으로 칠한 a에 접근해서 값을 바꿀 수 있을까요?

 

 

 네 바꿀 수 있습니다. 모든 함수에서 a에 접근할 수 있기 때문에, 문제가 될 수 있어요. 그런데 왜 제가 ps를 했을 때에는 자주 썼을까요? 이에 대한 답도 크게 어렵지 않습니다. 공통적으로 쓰는 변수들을 함수 내부에서 잘 컨트롤 한다면 인자 1개, 2개를 덜 넘겨도 되기 때문입니다.