Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어 함수의 스코프(범위) 규칙 완벽 정리 – 지역 변수 vs 전역 변수

C 언어에서 스코프(scope) 규칙은 변수가 프로그램 내에서 어떻게 다루어지는지를 결정하는 핵심 개념입니다. 스코프 규칙과 관련된 주요 요소는 다음과 같습니다.

  • 변수에 대한 접근 가능 여부
  • 변수가 존재하는 기간(생명 주기)
  • 변수를 사용할 수 있는 경계(유효 범위)

함수와 관련된 스코프 규칙

  • 함수는 특정 작업을 수행하는 독립적인(self-contained) 코드 블록입니다.
  • 함수 본문 내부에서 선언된 변수를 지역 변수(local variable)라고 합니다.
  • 지역 변수는 해당 변수를 생성한 특정 함수 내부에서만 존재하며, 다른 함수나 main 함수에서도 접근할 수 없습니다.
  • 함수가 자신의 작업을 완료하고 호출 지점으로 반환되는 순간, 지역 변수의 존재도 함께 소멸합니다.

예제 1 – 지역 변수를 사용한 스왑 함수

다음은 함수와 관련된 스코프 규칙을 보여주는 C 프로그램입니다.

#include<stdio.h>
main() {
    int a = 10, b = 20;
    printf("before swapping a=%d, b=%d", a, b);
    swap(a, b);
    printf("after swapping a=%d, b=%d", a, b);
}
swap(int a, int b) {
    int c;
    c = a;
    a = b;
    b = c;
}

출력 결과

Before swapping a=10, b=20
After swapping a=10, b=20

출력 결과를 보면 swap 함수 호출 후에도 값이 바뀌지 않았습니다. 그 이유는 C 언어가 기본적으로 값에 의한 호출(call by value) 방식을 사용하기 때문입니다. 즉, main 함수의 a와 b 값이 swap 함수의 매개변수에 복사될 뿐이며, swap 함수 내부의 a, b는 서로 다른 지역 변수입니다. 따라서 함수 내부에서 값을 교환해도 원본 변수에는 아무런 영향을 주지 못합니다.

전역 변수(Global Variable)

  • 함수 본문 외부, 즉 모든 함수 바깥에서 선언된 변수를 전역 변수(global variable)라고 합니다.
  • 전역 변수는 프로그램 내 어떤 함수에서든 접근하고 수정할 수 있습니다.

예제 2 – 전역 변수를 사용한 스왑 함수

다음은 전역 변수를 활용한 스코프 규칙 예제입니다.

#include<stdio.h>
int a = 10, b = 20;
main() {
    printf("before swapping a=%d, b=%d", a, b);
    swap();
    printf("after swapping a=%d, b=%d", a, b);
}
swap() {
    int c;
    c = a;
    a = b;
    b = c;
}

출력 결과

Before swapping a=10, b=20
After swapping a=20, b=10

이번에는 swap 함수 호출 후 값이 실제로 교환되었습니다. a와 b가 함수 외부에 선언된 전역 변수이므로, swap 함수가 직접 원본 데이터에 접근하여 값을 변경할 수 있기 때문입니다.

정리

지역 변수는 선언된 함수 안에서만 유효하며 함수 종료 시 소멸하지만, 전역 변수는 프로그램 전체에서 접근 가능하고 프로그램이 실행되는 동안 유지됩니다. 다만 전역 변수를 남용하면 코드의 가독성과 유지보수성이 떨어질 수 있으므로, 필요한 경우에만 신중하게 사용하는 것이 좋습니다.