앱 인벤터2 - 전역변수와 지역변수
본문 바로가기

용어 정리, 이슈/과학&기술

앱 인벤터2 - 전역변수와 지역변수

728x90
컴퓨터 강의 시간에 교수님께서 이야기해주셨다.
"에...이 앱인벤터의 변수 블록에는 전역변수와 지역변수를 설정할 수 있습니다. 사실 이 변수들은 그렇게 어려운 말이 아닙니다. 전역변수는 글로벌 바이레이블(global variable), 지역변수는 로칼 바이레이블(local variable)이라 카는데, 이러면 좀 더 이해하기 쉽죠?"

그래서 이 전역변수와 지역변수가 정확히 어떤 특징들을 가지고 있는지에 대해 찾고 정리해봤다.

앱인벤터 좌측 변수 블록을 클릭하면, 전역변수나 지역변수를 만들 수 있는 블록이 있다.

1. 전역변수(global variable)

컴퓨터 프로그래밍에서의 전역변수(global variable)프로그램 전체에서 볼 수 있는(접근 가능한) 전역범위(global scope)가 주어진 변수(variable)를 말한다. 한편, 컴파일 언어에서의 전역변수는 보통 특정 프로그램 전체 런타임 범위에서의 정적 변수를 말한다.

 

어떤 프로그래밍 언어에서는 모든 변수가 기본적으로 전역 변수인 경우가 있지만, 대부분의 현대 프로그래밍 언어에서의 변수는 렉시컬 범위(lexical scope)같은 제한적 범위(limited scope)를 가진다. 그러나 이런 제한적 스코프에서의 전역변수 또한 최상위 수준에서 변수 선언을 하는 경우 종종 최상위 범위 전체에서 전역 변수를 가지기도 한다. 한편, 프로그램 코드를 기능별로 나누는 모듈 프로그래밍이나 클래스 기반 객체지향 프로그래밍 언어 등에서는 전역변수는 존재하지 않는다. 말은 어렵게 했지만, 쉽게 말해 코드 전체에서 사용가능한 변수전역변수라고 한다고 알면 된다.

 

이런 전역변수는 시스템 첫기동 시에 한 번만 파일에서 읽어내고 그 다음에는 다양한 함수를 통해 지속적으로 자주 사용되는 설정 정보를 저장하는 변수를 함수에 매번 인수로서 전달하는 걸 피하기 위해 쓰거나, 병령 처리하는 스레드(하나의 프로세스를 분할해 처리할 수 있는 최소 단위)나 시그널 핸들러(시그널 처리를 위해 지정하는 함수)와 같이 호출/피호출의 관계가 없는 코드끼리 섹션간 정보를 전달하는 경우에 쓴다. 특히 이용 가능 메모리 용량이 적은 임베디드 시스템과 같이 까다로운 환경에서는 이 전역변수를 사용할 수 밖에 없다.

 

그런데 일반적으로 이 전역변수는 대부분 코드가 로드되자마자 바로 실행되고 코드가 끝나면 자동으로 종료된다. 이 말은 변수의 실행 주기가 길어 메모리 리소스를 오랫동안 소비해 속도가 느려진다는 뜻이다. 또한, 모든 코드가 전역변수를 참조하고 변경할 수 있기 때문에 코드가 자신도 모르게 바뀐다거나 상호의존이 높아지며 코드가 복잡해서 코드의 가독성이 안좋아지는 문제도 일어날 수 있다. 특히 C언어처럼 아직까지 일부분에서 이름공간(namespace, 이름을 붙여놓은 공간)을 갖지 않는 프로그래밍 언어에서는 소스 파일을 넘어 이 전역변수를 공유할 때 이름 충돌이 발생할 수도 있기 때문에 주의해서 사용하는 것이 좋다. (참고로 헝가리안 기법에서는 이 문제를 해결하기 위해 전역변수 앞에 'g_'를 붙이기도 한다.)

 

2. 지역변수(local variable)

컴퓨터 과학에서의 지역변수(local variable)전역변수와 반대로 프로그램의 일부분에서 볼 수 있는(접근 가능한) 지역범위(local scope)가 주어진 변수를 말한다. 

 

함수를 단순화해 가독성을 높이거나, 특정 함수가 어떤 부분에서 어떻게 연결되는지를 쉽게 확인할 수 있다는 장점이 있어 프로그래밍에서 자주 쓰인다. 그러나 이 지역변수가 포함된 지역을 벗어나면 해당 지역에 할당된 지역변수는 사라지게 된다는 단점이 있다.

 

3. 비지역변수(non-local variable)

프로그래밍 언어 이론에서, 비지역변수(non-local variable)는 지역변수가 아닌 변수를 말한다. 흔히 '지역변수가 아닌 것은 전역변수'라고 생각하기 쉬운데, 이런 맥락에 따라 비지역변수=전역변수라고 볼 수도 있는데, 한편 이 비지역변수는 일부 변수가 지역범위나 전역범위에 있을 수 없는 중첩 함수(nested function)나 익명 함수(anonymous function)의 맥락에서도 쓰인다.

중첩함수인 경우, 초록색 부분은 지역범위1의 비지역범위, 주황색+초록색부분은 지역범위 1-1의 비지역범위

위 사진처럼 지역범위1 안에 지역범위1-1가 들어간 중첩함수인 경우, 지역범위 1-1을 기준으로 지역범위1에서 해당 부분을 뺀 부분이 비지역범위가 된다. 지역범위1에게는 지역범위일지라도 말이다. 그 비지역범위에 있는 변수를 비지역변수라고 한다. 

 

3. 그럼 어떤 걸 쓰는 것이 좋을까?

대부분의 전공자나 현직자의 말을 들어보면 '지역변수를 쓰는 편이 좀 더 나을 것'이라는 이야기를 하는데, 그냥 필요에 따라 전역변수와 지역변수를 골라서 쓰면 된다. 스코프(범위)를 어떻게 잡고, 어떤 스코프에서 어떤 변수를 사용해야하는지 고려한 뒤 적절한 변수를 선택해서 수정하기도 쉽고, 운용하기도 쉬운 프로그램을 만드는 것이 최종 목표이기 때문이다!

 

 

 

 

반응형