mulll

[C언어] 정적 / 전역 / 지역 변수 스코프와 라이프타임 정리 본문

Advanced C Programming

[C언어] 정적 / 전역 / 지역 변수 스코프와 라이프타임 정리

dongha 2023. 1. 7. 01:30

변수는 변수의 종류마다 다른 스코프라이프타임을 가지며  또한 변수의 종류는 전역 변수, 정적변수(정적 전역 변수, 정적 지역 변수), 지역변수로 나뉜다.

 

힙에 동적 할당되는 벡터와 같은 동적 배열도 있지만 이 포스팅에서는 다루지 않을 것이다.

 

  • 라이프타임: 변수가 생성될 때와 소멸될 때
  • 스코프: 변수에 접근할 수 있는 영역

 

 

 

라이프타임

라이프타임의 경우 정적 변수와 전역 변수는 프로세스가 실행될 때 생성이 되며 프로그램 종료 시에 소멸한다. 하지만 지역 변수의 경우 프로세스가 실행될 때가 아닌 지역 변수가 선언된 함수가 호출되었을 시에 생성이 되며 함수가 종료 시에 사라진다.

 

스코프

다음은 접근 가능 영역에 대해서 알아본다. 정적 지역 변수과 지역변수의 경우, 당연히 중괄호 내부에서만 접근이 가능하다. 함수를 정의하는 중괄호 내에서 뿐만 아니라 for 문이나 if 문 같은 곳에 중괄호의 경우에도 중괄호 밖에선 접근이 불가능하다.

 

 

정적 전역 변수의 경우 파일내부 전체에서 접근이 가능하고 전역 변수의 경우에는 프로그램 전체에서 접근이 가능하다. 스코프가 프로그램 전체와 파일내부 전체가 어떻게 다른지 자세히 확인해본다.

 

전역 변수의 스코프와 정적 전역 변수의 스코프의 차이점

 

 

실행 코드 및 결과 - 1 : 외부파일에서 전역변수 호출 시

 

아래의 실행결과와 코드를 보면 다른 .c 파일에 존재하는 전역 변수를 이용하기 위해서는 extern 키워드를 붙이고 마치 전역 변수처럼 가장 위에 선언하여 사용할 수 있는 것을 알 수 있을 것이다. 함수 또한 extern 해올 수 있는 이유는 함수 또한 변수와 같이 특정 메모리 주소에 저장이 되기 때문에 외부 소스의 함수를 사용할 수 있다.

 

 

(위의 코드를 실행한 결과이다. main 함수에서 외부 파일에 있는 전역변수와 함수를 잘 출력하고 이용한 것을 확인할 수 있다. 당연히 컴파일 시 extern 하려는 소스코드 파일을 전부 컴파일 시켜야 한 프로그램이 완성되므로 gcc 뒤에 실행과 관련된 모든 c 파일을 달아줘야한다.)

 

 

실행 코드 및 결과 - 2 : 외부파일에서 정적전역변수 호출 시

하지만 sub2_m 변수의 경우 main 소스코드에서 extern를 시도하면 해당 변수를 찾지 못하였다는 에러 메시지가 출력이 된다.

 

정적전역변수를 extern 키워드를 통해 외부파일에서 호출하였어도, 정적전역변수는 스코프가 파일 내부이기 때문에 외부파일에서 접근할 수 없다. static이라는 키워드를 붙여 정적전역변수를 만들어, 외부로부터 접근을 하지 못하게하여 보안성이나 격리성이 높다.

 

 

협업 간의 정적 전역 변수의 스코프가 가지는 장점

 

  • 정적 전역 변수로 선언을 하면 협업 간에 변수명 충돌을 피할 수 있다. 만약 sub1.c 파일도 abc 라는 변수명이 있고 sub2.c 파일도 abc 라는 변수명이 있다. 만약 main에서 sub2의 a 변수를 쓰고 싶을 땐 충돌이 일어날 것이고 운좋게 원하는 파일에 변수를 가져왔다고 해도 abc 라는 변수가 차후에 다른 소스코드에 전역변수로 또 만들어졌을 경우 유지보수관점에서 보면 별로 좋지 않다.

  • 나의 소스코드 파일의 변수를 외부로부터 잘 제어할 수 있다. 보통은 협업 간에 개인에게 할당된 구현해야하는 기능들이 있을 것인데, 이는 소스코드 파일 단위로 협업을 하는 경우가 많다.

    만약 내 변수를 협업을 같이 하는 개발자가 사용을 해야하는데 그 개발자가 변수를 불러와 값을 수정하면 절대 안된다고 하면 어떻게 조치할 수 있을까?

    마치 JAVA의 getter 처럼 값을 리턴만 하는 전역 함수를 만들고 변수를 정적전역변수로 선언하면 파일 내에서 호출을 하지 않는 이상 값을 절대로 수정하지 못하고 받을 수만 있을 것이다.

    setter도 비슷하게 응용하자면 외부 파일에서 특정 범위를 벗어난 데이터 값으로 정적지역변수를 업데이트 하려는 시도가 있으면 그에 대한 조치를 함수의 기능을 통해 만들어 변수를 안전하게 보호할 수 있는 방법이 될 수 있다.

 

Comments