본문 바로가기
XR개발/C언어

C언어 변수 범위와 순환 호출

by 오머리쿠_OmaryKoo 2025. 1. 27.

1. 변수의 속성

변수는 기본적으로 값, 타입, 크기 등의 속성을 가지며, 이에 더해 범위(scope), 생존 시간(lifetime), 연결(linkage) 같은 추가적인 특성을 갖는다.
 

A. 변수의 범위

변수의 범위(Scope)란 해당 변수를 사용할 수 있는 영역을 의미한다. 변수의 범위는 크게 다음과 같이 나뉜다.
 
  • 지역 변수(Local Variable): 함수 또는 블록 내부에서 선언되어 해당 블록 내에서만 사용 가능
  • 전역 변수(Global Variable): 함수 외부에서 선언되어 프로그램 전체에서 사용 가능
  • 파일 범위(File Scope): 특정 소스 파일 내에서만 접근 가능한 변수

 

B. 변수의 생존 시간

변수의 생존 시간(Lifetime)은 메모리에 존재하는 기간을 의미한다. 변수가 선언된 위치에 따라 생존 시간이 달라지며, 특정 조건에서만 존재할 수도 있다.
 

C. 변수의 연결

변수의 연결(Linkage)이란 변수가 서로 다른 파일에서 참조될 수 있는지를 결정하는 속성이다. 변수를 외부에서 참조할 수 있도록 설정할 수도 있고, 특정 블록에서만 접근하도록 제한할 수도 있다.
 

외부 연결 (External Linkage)

전역 변수는 기본적으로 외부 연결을 가지며, 여러 파일에서 공유할 수 있다. extern 키워드를 사용하면 다른 파일에서도 변수를 사용할 수 있다.

 

내부 연결 (Internal Linkage)

정적 전역 변수는 내부 연결을 가지며, 하나의 파일 내에서만 사용할 수 있다.

2. 지역 변수와 전역 변수

A. 지역 변수 (Local Variable)

지역 변수는 특정 블록 안에서만 유효한 변수로, 선언된 블록을 벗어나면 사용할 수 없다. C 언어에서는 중괄호 {} 안에 선언된 변수가 해당 블록 내에서만 존재하는 지역 변수이다.
위 코드에서 y 변수는 while 문 내부에서만 존재하며, 블록을 벗어나면 사용할 수 없다.
 
* 함수의 헤더 부분에 정의되어 있는 매개 변수도 일종의 지역 변수이다. 즉, 지역 변수가 지니는 모든 특징을 가지고 있다. 단, 지역 변수와 다른 점은 함수 호출 시의 인수 값으로 초기화되어 있다는 점이다.

 

08_Q&A 함수 매개변수 선언에 대한 물음.zip

Q1. main 함수 안에 선언한 것과 매개변수에서 선언하는 것에서 왜 서로 다른가?✓ int math(int x, int y) 의 의미 매개변수 int x와 int y는 이 함수가 호출될 때 값을 전달받기 위한 지역 변수이다.이 x

omarykoo.tistory.com

 

B. 전역 변수 (Global Variable)

전역 변수는 함수 외부에서 선언되며 프로그램 전체에서 접근할 수 있다.
전역 변수 A와 B는 add() 함수와 main() 함수에서 모두 사용될 수 있다.
 

전역 변수 사용 시 주의할 점

전역 변수는 사용이 편리하지만, 여러 함수에서 동시에 접근할 수 있어 예상치 못한 오류를 발생시킬 가능성이 있다. 따라서 모듈화된 프로그래밍을 위해 가급적 전역 변수 사용을 최소화하는 것이 바람직하다.

3. 변수의 생존 시간과 저장 클래스

변수의 생존 시간은 정적 할당(static allocation)자동 할당(automatic allocation) 으로 나뉜다.
 

A. 자동 변수 (Auto Variable)

기본적으로 모든 지역 변수는 자동 변수입니다. 블록이 시작될 때 생성되고, 블록이 종료되면 소멸된다.

B. 정적 변수 (Static Variable)

정적 변수는 프로그램이 종료될 때까지 메모리에 유지되는 변수이다.
위 코드에서 scount는 static 변수이므로 함수가 종료되더라도 값이 유지되지만, acount는 일반 지역 변수이므로 함수가 호출될 때마다 초기화된다.

4. 가변 매개 변수 함수

C 언어에서는 매개변수의 개수가 가변적인 함수를 정의할 수 있다.


5. 함수의 매개 변수와 순환 호출 (Recursive Call)

함수의 매개변수 또한 지역 변수의 일종이며, 호출될 때마다 새로운 메모리 공간을 할당받는다.
위 코드에서 inc(i)를 호출해도 i 값은 변경되지 않는다. 이는 Call by Value(값에 의한 호출) 방식이기 때문이다.
 

순환 호출 (Recursive Call)

순환 호출은 함수가 자기 자신을 다시 호출하는 방식으로, 대표적인 예로 팩토리얼 연산이 있다.
순환 호출은 문제를 간단한 형태로 분해할 때 유용하지만, 종료 조건을 명확히 설정하지 않으면 무한 루프가 발생할 수 있으므로 주의해야 한다.
728x90