지역변수

반응형

3.3. 지역변수, 전역변수

시스템 프로그래밍은 컴퓨터의 CPU 구조랑, 어셈블리 언어, 어셈블리 언어를 해석해서 컴퓨터가 알 수 있게 기계어로 바꿔주는 어셈블러의 작동원리, 운영체제도 포함된 과목입니다. 한 마디로 우리가 사용하는 프로그램과 컴퓨터 장치 사이에서 일하는 것이 시스템 프로그램이라고 할 수 있지요.

시스템 분석 설계는 건물을 짓기 전에 먼저 설계를 하는 것처럼 프로그램을 짤 때 전체적인 설계를 하는 것입니다.

보통 프로그래머가 되려면 자바, C, 비주얼 베이직 같은 프로그래밍 언어만 배우면 되는 것으로 생각을 하기 쉬운데, 사실 프로그래밍 언어는 한 부분에 불과하답니다. 그래서 좋은 프로그래머가 되기 위해선 많은 교육과 경험이 필요하지요.

오늘도 함수에 관한 이야기랍니다. 제목엔 변수라고 나와있지만요. 먼저 예제를 보실까요?

>>> jjang = '09'

제가 가서 바로 짱 먹었지요. 흐흐흐…

>>> jjang = 'pig dad'

애들한테 물어보면 누가 짱이라고 할까요? 당근…

>>> jjang
'pig dad'

그런데 자기네 반에서 짱이라고 깝죽거리는 녀석이 있었으니, 바로 땡칠이라는 친구였답니다. 반이라는 함수를 만들어 보죠.

>>> def ban():
...   jjang = '07'
...   print 'jjang =', jjang
...
>>> ban()
jjang = 07

그러나… 땡칠이도 제 앞에선 깨갱~이랍니다. 울 학교 짱은 변함 없이 저걸랑요…

>>> jjang
'pig dad'

ban() 함수 안에서 jjang = '07'이라고 하면 jjang이란 변수를 새로 만드는 거구요, 기존의 jjang에는 영향을 미치지 않습니다. 그리고, ban 함수가 끝날 땐 그 함수 내에서 만들었던 변수들은 모두 없어지는 거죠.

이와 같이 함수 안에서 만들어진 변수를 지역변수라고 하고, 함수 밖에서 만들어진 변수를 전역변수라고 합니다. 지역변수는 함수가 호출되면 만들어져서, 함수의 실행이 끝날 때 함께 없어지는 반면, 전역변수는 함수와는 관계없이 항상 꿋꿋이 지구를 지킨답니다. 그래서 영어로 전역변수를 global이라는 말로 표현하지용…

지역변수를 함수 밖에서 한번 불러볼까요?

>>> def d_is_10():
...     d = 10               # 지역변수
...     print 'd 값은 ', d, '입니다'
...
>>> d_is_10()
d 값은  10 입니다
>>> d
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: name 'd' is not defined

d를 불러봐도 'd라는 이름이 없다'는 에러 메시지만 뜨지요? d_is_10() 함수가 실행되는 동안은 d가 있었는데, 함수의 실행이 끝난 다음에 함께 사라져버렸기 때문입니다. 반대로, 전역변수는 함수 안에서도 얼마든지 사용할 수 있답니다.

>>> x = 10                 # 전역변수
>>> def printx():
...   print x
...
>>> printx()
10

그렇다면 지역변수 대신 전역변수만 쓰는 것이 편하겠다구요? 글쎄요… 전역변수는 프로그램이 복잡해질수록 골치거리가 된답니다. 다른 엉뚱한 함수 때문에 변수의 값이 바뀌어버리는 수가 종종 있거든요. 그래서 필요에 따라 지역변수와 전역변수를 골라 쓰는 것이 좋답니다.

그리고, 함수 안에서 전역변수를 만드는 방법도 있답니다. 어떤 변수를 전역변수(global)로 사용하겠다라고 명시해주는 것이죠.

>>> def e_is_10():
...     global e            # 전역변수
...     e = 10
...     print 'e 값은 ', e, '입니다'
...         
>>> e_is_10()
e 값은  10 입니다
>>> e
10

여기서는 e_is_10() 함수가 실행되면서 e라는 전역변수가 만들어지고, 이 변수는 함수의 실행이 끝난 다음에도 없어지지 않습니다.