변수의 Life time은 프로세스가 실행되었을 때 데이터인 변수가 메모리를 할당받고 저장되어 공간을 차지하고 있는 시간을 말한다. 전역변수는 프로그램 어디에서든 접근이 가능해야한다. 따라서 프로그램의 시작부터 종료까지 메모리를 차지하고 있어야하고 프로그램이 시작될 때부터 종료될 때까지가 전역변수의 life time이다. 지역 변수는 전역 변수와 달리 함수나 블록 내부에서 선언된다. 그렇기 때문에 그 블록을 나가게 되면 더 이상 필요가 없기 때문에 메모리를 반환하고 사라지게 된다. 따라서 지역변수의 life time은 함수나 블록 내부에서 선언되어 메모리에 할당되는 순간부터 그 지역변수를 감싸는 블록이 끝나 메모리에서 해제되는 순간까지이다.
변수의 Scope는 변수에 접근할 수 있는 범위를 말한다. 이는 변수의 Life time과 밀접하게 연관된다. 메모리에 변수가 존재해야 접근할 수 있기 때문이다. 변수의 종류는 크게 2가지가 있다. 하나는 Global 변수, 다른 하나는 Local 변수이다. 이 2가지에 추가하여 언어가 함수의 nesting을 허용을 하는 경우 non-local이 존재하기도 한다. 함수의 nesting은 함수 안에 함수를 선언하는 것을 말한다. 아래의 python코드와 같이 말이다.
def out_func(int a):
a += 10
def in_func(int b):
b += a
이 코드에서 out_func 안에 in_func이 존재한다. 이때 out_func는 부모가 되고 in_func은 자식이 된다. 자식 함수는 부모 함수의 지역변수를 접근할 수 있다. 이때 부모 함수의 지역변수를 non-local 변수라고 부른다.
변수의 Scope는 크게 두 가지가 있다. 하나는 static scope 다른 하나는 dynamic scope이다. static scope는 프로그램의 구조상 결정이 된다. static scope에서 접근할 수 있는 변수는 전역변수, 지역변수, nesting이 허용된 언어의 경우 non-local변수까지 존재한다. 지역변수는 그 함수나 블록 내에서만 사용 가능하고 전역변수는 모든 함수에서 접근 할 수 있다. 우리는 코드를 보고 어떤 변수는 어디서 접근 가능한지 알 수 있다. 위의 코드를 보고 우리는 구조적으로 in_func은 out_func의 자식 함수이므로 out_func의 지역변수에 접근할 수 있다는 것을 알 수 있다. 우리가 아는 언어들 C언어, C++, python, Java는 모두 static scope이다.
dynamic scope는 우리가 코드를 보고 구조적으로 알 수 없다. dynamic scope는 프로그램이 실행되는 runtime에 결정된다. 예를 들어 아래와 같은 실행이 있다고 하자.
1. main -> func1 -> func2 -> func3
2. main -> func3
static scope에서는 1번과 2번 모두 func3가 사용할 수 있는 변수가 동일하다. nesting이 허용 되지 않았다고 한다면 전역번수, func3의 지역변수. 하지만 dynamic scope에서는 1번과 2번에서 func3가 사용할 수 있는 변수의 범위가 다르다.
1번에서는 전역변수, main 지역변수, func1 지역변수, func2 지역변수, func3 지역변수를 사용 가능하고 2번에서는 전역변수, main 지역변수, func3 지역변수를 사용할 수 있다. 즉 자신을 호출한 함수의 변수까지 사용할 수 있는 것이다. 그렇기 때문에 우리는 프로그램 구조상 접근할 수 있는 변수를 알지 못한다. 접근할 수 있는 변수는 runtime에 결정되기 때문이다.
전역 변수에 대하여 더 이야기 하자면 static scope에서 전역변수는 가급적 사용을 지양한다. 전역변수로 선언 시 프로그램 전체에서 쉽게 접근할 수 있어 편리하지만 module간의 coupling 즉 결합도가 높아지면 전역변수를 공유함으로써 의도와는 다르게 다른 module에 영향을 주어 결과 값이 예상과 다를 수 있기 때문이다. 마지막으로 지역변수와 전역변수가 같은 이름으로 생성될 수도 있다. 이러한 경우 전역변수를 hidden variable이라고 부른다. 이렇게 지역변수와 같은 이름의 다른 변수를 사용하고자 하는 경우 scope operator를 사용할 수 있다. C++에서는 scope operator로 :: 기호를 사용한다.
그렇다면 C언어에서 static으로 선언한 변수는 어떻게 될까? 그런 변수는 scope는 지역 변수 성격을 가지고 있지만 life time은 전역 변수 성격을 가지고 있는 변수가 된다.
'프로그래밍 언어' 카테고리의 다른 글
Stack-dynamic variable과 Heap-dynamic variable (0) | 2021.07.22 |
---|---|
Static Binding과 Dynamic Binding (0) | 2021.07.22 |
Backus-Naur Form(BNF)의 표현법 (0) | 2021.07.22 |
폰 노이만 컴퓨터 구조(Von Neumann Architecture) (0) | 2021.07.21 |