A good start would be to know what a static variable is.
C언어에서 사용되는 "정적변수(static variable)" 개념에 대해 알아보자.
// static 자료형 변수명;
static char *save;
위와 같은 형태로 자료형 앞에 static을 붙여 사용하는 정적변수는 다음과 같은 사전적 정의를 가진다.
정적 변수(靜的變數, static variable)는 정적으로 할당되는 변수이며, 프로그램 실행 전반에 걸쳐 변수의 수명이 유지된다.
즉, 프로그램이 종료되기 전까지 변수가 메모리에 남아있는다는 뜻인데 조금 더 자세하게 이해하기 위해 메모리 구조를 살펴보았다.
지금까지의 과제를 진행할 때 가장 자주 사용했던 지역변수는 메모리 구조에서 Stack 영역에 저장된다. Stack 영역에 저장되는 변수들은 함수가 시작될 때 메모리가 할당되고, 함수가 종료될 때 삭제된다. 따라서 Stack 영역은 컴파일 타임에 그 크기가 결정된다.
(cf. 동적할당은 컴파일을 마친 프로그램을 사용자가 실행시킬 때 메모리를 사용하므로 동적할당과 관련된 Heap 영역은 런 타임에 크기가 결정된다.)
반면, 정적변수와 전역변수의 경우 메모리 구조의 Data 영역에 저장된다. Data 영역의 변수들은 프로그램이 시작될 때 메모리가 할당되고, 프로그램이 종료될 때 자동으로 삭제된다.
각 변수의 특징들을 정리하자면 아래와 같다.
지역변수 (Local Variable)
- 함수 안에서 선언
- 선언된 함수에서만 사용 가능 (함수를 벗어날 경우 변수의 메모리 값이 소멸된다.)
- 초기화하지 않을 경우 컴파일 에러가 발생하거나, 쓰레기값이 저장된다.
- 함수 시작 시 Stack에 메모리 할당
- 함수 종료 시 메모리 free
전역변수 (Global Variable)
- 함수 밖에서 선언
- 프로그램 내부에 있는 모든 함수에서 사용 가능 (프로그램이 종료될 경우 메모리 값이 소멸된다.)
- 초기화하지 않을 경우 초기값이 자동으로 0으로 저장된다.
- 프로그램 시작 시 Data에 메모리 할당
- 프로그램 종료 시 메모리 free
정적변수 (Static Variable)
- 프로그램이 종료될 때까지 값이 유지된다.
- 초기화하지 않을 경우 초기값이 자동으로 0으로 저장된다.
- 프로그램 시작 시 Data에 메모리 할당
- 프로그램 종료 시 메모리 free
- 프로그램의 시작과 종료 시에 메모리가 할당되므로 함수가 여러 번 호출되더라도 초기화는 한 번만 이루어진다.
지역변수 앞에 static을 붙여 사용할 경우 정적지역변수가 되고, 전역변수 앞에 static을 붙여 사용할 경우 정적전역변수가 된다.
정적지역변수 : 함수 내에서 선언되고, 해당 함수 내에서만 사용할 수 있다.
정적전역변수 : 선언된 파일 내에서만 사용 가능하고 외부 파일에서 접근할 수 없다.
정적지역변수의 경우, 전역변수와 성질이 비슷하지만 특정 함수에서만 접근이 가능하다는 특징을 가지므로 함수가 끝나도 유지해야할 값이 있다면 전역변수보다는 정적지역변수를 사용하는 것이 좋다. 접근 가능한 함수의 범위가 한정되어있어 전역변수보다 유지보수가 쉽고, 안정적이기 때문이다.
정적변수에 대해서 공부해 보라는 조언이 명시되어 있다는 건
gnl 구현 시 함수가 끝나도 유지되어야 하는 값이 필요하다는 뜻인데...
함수 구조를 조금 더 고민해봐야 할 것 같다.
To be Continued...
'42' 카테고리의 다른 글
[C] printf() 구현하기 - 가변 인수 함수란? (0) | 2023.12.16 |
---|---|
[C] printf() 함수란? (1) | 2023.12.06 |