C++ 프로그래밍/함수

변수의 가시 범위와 생존기간

같은편 2022. 7. 11. 12:57

변수와 함수는 밀접하게 관련되어 있습니다.

예를 들어, 함수가 끝나면 지역 함수 내의 변수들과 매개변수들은 모두 자동으로 소멸됩니다.

모든 변수는 다음의 세 가지 속성이 있고, 이러한 속성에 따라 여러 가지로 분류할 수 있습니다.

  • 범위(visibility): 코드 내에서 변수가 의미 있는 영역
  • 생존기간(lifetime): 만들어지는 시점과 소멸되는 시점
  • 연결(linkage): 외부에서 선언된 변수를 사용하는 방법

지역변수와 전역변수

변수는 의미를 갖는 범위에 따라 지역변수와 전역변수로 나눌 수 있습니다.

 

지역(local) 변수

  • 중괄호 { }로 정의되는 블록 안에서 선언되는 변수로 블록 범위(block scope)를 갖는다. 함수 안에서 선언된 변수가 대표적인데, 변수가 선언된 블록(함수 몸체) 안에서만 의미가 있고 외부에서는 의미가 없다.
  • 중첩된 블록에서는 선언된 블록과 그 내부의 블록들에서만 의미가 있다.
  • 선언 위치에서 만들어지고 해당 블록의 끝나면 소멸된다.
  • 함수의 매개변수도 일종의 지역변수로 함수가 종료되면 소멸된다.

전역(global) 변수

  • 함수의 외부에서 선언되고, 파일 범위(file scope)를 갖는다.
  • 변수가 선언 위치 이후부터 파일의 끝까지 어떤 함수나 블록에서도 접근이 가능하고, 따라서 여러 함수에서 동일한 자료를 공유할 수 있다.
  • 프로그램이 시작할 때 만들어지고, 프로그램이 끝나야 없어진다.
  • "자료를 공유한다" 라는 것은 편리하지만 프로그램 모듈(함수 같은거라고 이해해도 된다)들이 연관되는 문제가 발생한다. 이것은 어떤 함수가 다른 함수에 의도하지 않은 영향을 줄 수 있게 되고, 결국 프로그램을 매우 불안정하게 만들 수 있다.

 


#include <stdio.h>
int Version; //Version은 전역변수 이므로 이후 모든 부분에서 이용 가능함
int Count; //Count도 전역변수 이므로 이후 모든 부분에서 이용 가능함

int add(int a, int b); //add함수 원형 선언
int main()
{
	int x = 10; //x는 main함수 블록에서 선억된 지역 변수로 main함수가 끝날 때까지만 사용 가능
	for (int i = 0; i < x; i++) //for문에서 선언된 i는 for문 블록내에서만 사용 가능 
	{
		//...
	}
	while (true)
	{
		int y; //y는 while 블록에서 선언된 지역변수이므로 while루프 안에서만 사용 가능
	}
	int z; //main함수 내에서 선언된 z도 지역변수로 이후부터 함수 블록 끝날때까지 사용 가능
	z = add(3, 4);
	//...

	return 0;
}
int add(int a, int b) //함수의 매개변수 a와 b도 지역변수로 함수 블록에서만 사용 가능
{
	int sum = a + b; //지역변수 sum도 add함수 블록에서만 사용 가능
	return sum;
}