Q. 지역변수, 전역변수가 누구야?
코드를 작성할 때, 우리는 변수를 전역적으로 하느냐 지역적으로 하느냐의 선택이 가능합니다.
전역이라고 하면 함수 밖에서 정의되어 보통 전범위에서 사용 가능한 변수가 됩니다.
지역 변수는 반대로 함수 안에서 정의되었으니, 해당 함수에서만 사용이 가능해집니다.
Q. 어떤 건진 알겠는데, 각각 어떻게 쓰려고 할 때 사용해?
전역 변수는 어느 함수에서나 쓸 수 있습니다. 따라서 모든 함수에서 읽고 사용하고 공유하려 할 때 씁니다.
지역변수는 해당 함수 안에서만 쓰일 때 쓰면 됩니다.
Q. 그럼 매번 따로 작성하는 지역변수보다는 한 번만 적으면 되는 전역 변수를 쓰는 게 간편한 거 아니야?
아닙니다. '공유'되는 변수이기 때문에 한 곳에서 오류가 발생시 전체프로그램이 망가질 수 있습니다.
또한 한번 전역으로 선언하면 일반적인 작성으로는 함수 안에서 전역변수의 값을 변동시킬 수도 없습니다.
즉, 함수 밖의 a라는 변수와 함수 안의 a라는 변수는 이름만 같은 다른 놈입니다.
a=1
def test():
a=555
print(a)
test()
print(a)
위의 코드에서 test()함수를 통해 출력된 a값은 555, 마지막 함수 밖에서 출력되는 a가 1이 나오는 것처럼요.
test()안에서 a를 정의하지 않았다면 출력값 두 개 모두 1로 나옵니다.
Q. 바꿀 수 없으면 변수가 아니잖아??
일반적인 작성으로는 안 됩니다. 그러나 보통의 파이썬 문법처럼 a만 적는 것이 아닌 global 타입을 앞에 붙이면 됩니다.
a=1
def test():
global a=555
print(a)
test()
print(a)
위는 출력값 두 개 모두 555가 나옴을 확인할 수 있는 코드입니다.
Q. 그럼 전역변수로 선언하면 오류의 위험이 있어서 안 되는 거구나
맞습니다. 그러나 조금 더 발전하면 PYTHON이 객체지향언어라는 것을 고려해볼 수 있습니다.
글로벌 변수(전역변수)를 사용한다는 것은 객체지향언어의 특성 중 하나인 캡슐화(은폐)를 무시하는 걸로 볼 수 있습니다. 누구나 쓸 수 있다는 점에서 보호를 받기 어렵습니다. 또한 Class로 묶어 객체개념으로 접근을 하려는 의도와 전역변수는 어울리지 않습니다. 나중에 코드재활용도 또한 어려워지겠죠.
객체지향이 아니더라도 깨끗한 코딩을 원한다면 정리단계에서 이러한 글로벌 변수를 지양하는 것이 옳다 봅니다.