지역변수
지역변수(Local Variable)는 컴퓨터 프로그래밍에서 특정 블록 내에서 선언되고 해당 블록이 실행되는 동안에만 유효한 변수이다. 일반적으로 함수, 메서드, 반복문, 조건문 등의 코드 블록 내부에서 정의되며, 그 범위를 벗어나면 접근할 수 없다. 지역 변수는 스택 메모리에 저장되며, 해당 블록이 종료되면 소멸된다. 이는 전역 변수(global variable)나 정적 변수(static variable)와 대비되는 중요한 개념이다.
목차
[숨기기]정의와 개념[편집]
지역 변수는 특정한 코드 영역(scope) 내에서 선언되며, 해당 영역이 실행되는 동안에만 유효하다. 지역 변수는 자동 저장(auto storage duration) 특성을 가지며, 일반적으로 함수가 호출될 때 생성되고 함수가 반환되면 제거된다.
예:
void foo() { int a = 5; // a는 지역 변수 printf("%d", a); } // a는 이 지점을 벗어나면 소멸됨
이 변수는 함수의 매개변수와 함께 사용되며, 해당 함수에서만 접근 가능하다. 이를 통해 함수의 독립성과 모듈화를 도모할 수 있다.
특징[편집]
특성 설명 유효 범위 선언된 블록 내 생명 주기 블록 진입 시 생성, 종료 시 소멸 메모리 위치 스택 영역 초기화 명시적 초기화 필요 (언어에 따라 다름) 보안성 외부 접근 불가, 캡슐화에 유리
지역 변수는 프로그램의 흐름 제어에서 매우 중요한 역할을 하며, 특히 함수 단위의 모듈화나 재귀 호출에서 데이터의 독립성과 안정성을 보장하는 핵심적인 요소로 사용된다.
메모리 구조[편집]
지역 변수는 함수 호출 시 스택 프레임(stack frame)에 저장된다. 이는 LIFO(Last-In-First-Out) 방식으로 관리되며, 함수가 리턴될 때 해당 스택 프레임도 제거된다. 컴파일러는 함수 호출 시점에 스택 포인터(stack pointer)를 조작하여 지역 변수에 대한 메모리 공간을 확보하고, 함수 종료 시 복원한다.
- 장점
- 메모리 재사용이 용이함
- 접근 속도가 빠름 (CPU 레지스터 활용 가능)
- 단점
- 함수 종료 시 변수 소멸
- 스택 오버플로우 가능성 (특히 재귀에서)
- 예시
- 스택 프레임 구성
main: call foo foo: push ebp mov ebp, esp sub esp, 8 ; 두 개의 지역 변수 공간 확보 ... mov esp, ebp pop ebp ret
지역 변수의 유형[편집]
- 블록 레벨 지역 변수
일반적인 if문, for문, while문 내에 선언된 변수:
for (int i = 0; i < 10; ++i) { int temp = i * 2; printf("%d", temp); } // i, temp는 루프 종료 시 소멸
- 함수 내부 변수
함수 내에 선언된 변수로, 그 함수 내에서만 접근 가능:
void add(int x, int y) { int result = x + y; printf("%d", result); }
- 매개변수 (Parameter)
함수의 인자도 지역 변수로 간주된다. 일반적으로 함수 호출 시 복사되며, 함수 내에서 독립적인 변수를 구성한다.
def greet(name): print(f"Hello, {name}!") # name은 greet 함수의 지역 변수
- 중첩 블록의 변수
중첩된 블록에서 지역 변수를 정의할 수 있으며, 외부 블록과 이름이 같아도 내부 변수가 우선된다. 이를 섀도잉(shadowing)이라고 한다.
int x = 10; void foo() { int x = 5; // 외부의 x를 가림 printf("%d", x); // 5 출력 }
언어별 차이점[편집]
- C/C++
- 기본 저장 기간은 자동(auto)
- 명시적으로 auto 키워드를 사용할 수도 있으나 기본값
- 함수 호출 시마다 스택에 할당
- register 키워드를 사용하여 레지스터에 저장 요청 가능 (현대 컴파일러는 무시할 수도 있음)
- Python
- 함수나 클래스 내에서 선언된 변수는 지역 변수
- 전역 변수와 같은 이름을 사용할 경우 global 키워드 필요
def foo(): global count count += 1
- 클로저, 람다 등에서의 지역 변수는 특별한 스코프 규칙을 따름
- Java
- 메서드 내부에서 선언된 변수는 모두 지역 변수
- 반드시 초기화 후 사용해야 함
- final 키워드를 이용해 상수로 선언 가능
- 내부 클래스에서 사용되는 지역 변수는 effectively final이어야 함
- JavaScript
- var, let, const 사용 가능
- let과 const는 블록 스코프, var는 함수 스코프
- 호이스팅(hoisting)과 TDZ(Temporal Dead Zone)에 주의 필요
- Rust
- 변수는 기본적으로 지역 변수이며 불변임 (let 사용)
- 가변 변수는 let mut으로 선언
- 스코프가 명확히 구분되고 소멸 시점이 명시적임 (RAII 적용)
지역변수와 전역변수의 비교[편집]
속성 지역 변수 전역 변수 선언 위치 블록 내부 블록 외부 접근 가능 범위 선언된 블록 내부 전체 프로그램 메모리 위치 스택 데이터 세그먼트 생명 주기 블록 실행 중 프로그램 전체 캡슐화/보안성 우수 낮음 동시성 처리 안전함 동기화 필요
장점[편집]
- 메모리 효율성: 사용이 끝나면 메모리에서 제거됨
- 코드의 안전성: 외부로부터의 접근 제한
- 독립성 확보: 함수의 독립성과 모듈화 강화
- 병렬 처리 유리: 지역 변수는 각 스레드마다 복사되어 동기화 문제 적음
- 디버깅 용이: 함수별로 변수 추적 가능
단점[편집]
- 재사용성 부족: 다른 함수에서 재사용 불가
- 데이터 유지 불가: 함수 호출 간 데이터 보존이 어려움
- 스택 한계 문제: 많은 지역 변수 사용 시 스택 오버플로우 가능
- 섀도잉 가능성: 외부 변수와 이름 충돌 시 혼란 야기 가능
지역 변수와 클로저[편집]
지역변수는 클로저(closure)의 핵심 개념 중 하나로, 함수가 자신의 지역 변수를 감싸고 유지하는 함수를 생성할 수 있다.
function outer() { let count = 0; return function() { count++; console.log(count); }; } const counter = outer(); counter(); // 1 counter(); // 2
이러한 구조는 상태를 은닉하고 유지하는 데 유리하며, 특히 콜백 함수나 비동기 처리에서 유용하게 사용된다.
관련 개념[편집]
- 전역 변수 (Global Variable): 프로그램 전체에서 접근 가능한 변수
- 정적 변수 (Static Variable): 지역 변수와 유사하나, 생명 주기가 프로그램 전체
- 스택 메모리 (Stack Memory): 함수 호출 시 임시로 사용되는 메모리 영역
- 스코프 (Scope): 변수의 유효 범위
- 생명 주기 (Lifetime): 변수의 존재 기간
- 섀도잉 (Shadowing): 동일한 이름의 지역 변수가 외부 변수를 가리는 현상
- RAII (Resource Acquisition Is Initialization): 객체 수명에 따라 자원 관리
- 캡슐화 (Encapsulation): 데이터를 숨기고 인터페이스만 제공
같이 보기[편집]