|
| 1 | +--- |
| 2 | +sidebar_position: 7 |
| 3 | +title: 변수의 영역 |
| 4 | +description: 지역 변수와 전역 변수의 개념과 특징을 설명 |
| 5 | +--- |
| 6 | + |
| 7 | +## 1. 핵심 개념: 변수의 범위 (Variable Scope) |
| 8 | + |
| 9 | +변수의 범위는 **변수가 선언된 위치**에 따라 프로그램 내에서 해당 변수에 접근하고 사용할 수 있는 영역을 의미합니다. |
| 10 | +C 언어에서는 크게 두 가지 주요 변수 범위가 있습니다: **지역 변수**와 **전역 변수**. |
| 11 | + |
| 12 | +--- |
| 13 | + |
| 14 | +### 1.1. 지역 변수 (Local Variables) |
| 15 | + |
| 16 | +- **정의:** |
| 17 | + 함수 내부 또는 블록 안에서 선언되는 변수입니다. |
| 18 | + |
| 19 | +- **유효 기간:** |
| 20 | + 선언된 함수나 블록이 종료되면 소멸됩니다. |
| 21 | + |
| 22 | +- **유효 범위:** |
| 23 | + 해당 함수 또는 블록 내에서만 유효합니다. |
| 24 | + |
| 25 | +- **예시:** |
| 26 | + `main()` 함수 내에서 선언된 변수는 `main()`이 종료될 때까지, |
| 27 | + 중괄호 `{}` 블록 내에서 선언된 변수는 해당 블록이 종료될 때까지 유효합니다. |
| 28 | + |
| 29 | +- **중요:** |
| 30 | + > 저장된 주소가 다르면 변수의 이름이 같아도 다른 값을 가집니다. |
| 31 | + > 즉, 다른 블록 내에서 동일한 이름의 지역 변수를 선언할 수 있으며, 이들은 서로 독립적인 변수로 취급됩니다. |
| 32 | +
|
| 33 | +--- |
| 34 | + |
| 35 | +### 1.2. 전역 변수 (Global Variables) |
| 36 | + |
| 37 | +- **정의:** |
| 38 | + 함수 외부에서 선언하여 프로그램의 어느 곳에서든 접근할 수 있는 변수입니다. |
| 39 | + |
| 40 | +- **유효 기간:** |
| 41 | + 프로그램이 종료될 때까지 유효합니다. |
| 42 | + |
| 43 | +- **유효 범위:** |
| 44 | + 프로그램 전체에서 유효하며, 모든 함수에서 공유하여 사용할 수 있습니다. |
| 45 | + |
| 46 | +--- |
| 47 | + |
| 48 | +## 2. 핵심 개념: 변수의 저장 유형 지정자 (Storage Class Specifiers) |
| 49 | + |
| 50 | +저장 유형 지정자는 변수의 **저장 방식, 유효 범위, 생존 기간**을 제어합니다. |
| 51 | + |
| 52 | +### 2.1. `auto` |
| 53 | + |
| 54 | +- **특징:** |
| 55 | + 보통 생략되며, 지역 변수 선언 시 사용됩니다. (지역 변수의 기본 저장 유형) |
| 56 | +- **작동 방식:** |
| 57 | + 함수나 블록이 실행될 때 메모리가 할당되고, 종료 시 해제됩니다. |
| 58 | + |
| 59 | +### 2.2. `static` |
| 60 | + |
| 61 | +- **특징:** |
| 62 | + - 지역 변수가 정적으로 변환됨 |
| 63 | + - 프로그램 종료 전까지 변수의 변경된 값을 저장함 |
| 64 | + - 함수가 여러 번 호출되어도 값이 유지됨 |
| 65 | +- **작동 방식:** |
| 66 | + 한 번 초기화된 후 함수 호출이 끝나도 값이 유지됩니다. |
| 67 | + (특정 함수의 호출 간에 상태를 유지해야 할 때 유용) |
| 68 | + |
| 69 | +### 2.3. `register` |
| 70 | + |
| 71 | +- **특징:** |
| 72 | + 변수가 CPU 레지스터에 저장되어 빠르게 처리됨 |
| 73 | +- **작동 방식:** |
| 74 | + 컴파일러에게 해당 변수를 가능한 한 CPU 레지스터에 저장하도록 요청 |
| 75 | + (실제 레지스터에 저장될지는 컴파일러의 판단에 따름) |
| 76 | + |
| 77 | +--- |
| 78 | + |
| 79 | +## 3. 코드 예시 분석 |
| 80 | + |
| 81 | +아래 코드는 변수의 범위와 저장 유형 지정자의 동작을 명확하게 보여줍니다. |
| 82 | + |
| 83 | +```c |
| 84 | +#include <stdio.h> |
| 85 | + |
| 86 | +int i = 1; // 1) 전역 변수 |
| 87 | + |
| 88 | +int main() { |
| 89 | + int i = 1; // 2) 자동 변수 (main 함수의 지역 변수) |
| 90 | + printf("첫번째 i=%d\n", i); // main 내의 i 출력 (값: 1) |
| 91 | + |
| 92 | + { |
| 93 | + register int i = 2; // 3) 레지스터 변수 (블록 내의 지역 변수) |
| 94 | + printf("두번째 i=%d\n", i); // 블록 내의 i 출력 (값: 2) |
| 95 | + } |
| 96 | + |
| 97 | + printf("첫번째 i=%d\n", i); // 블록을 벗어나면 다시 main 내의 i 출력 (값: 1) |
| 98 | + return 0; |
| 99 | +} |
| 100 | + |
| 101 | +void iChange() { |
| 102 | + static int i = 1; // 4) static 변수 (iChange 함수의 지역 변수, 값이 유지됨) |
| 103 | + printf("i=%d\n", i); |
| 104 | + i++; |
| 105 | +} |
| 106 | + |
| 107 | +void iGlobal() { |
| 108 | + printf("global i= %d\n", i); // 전역 변수 i에 접근 (값: 1) |
| 109 | +} |
| 110 | +``` |
| 111 | + |
| 112 | +#### 예시 설명 |
| 113 | + |
| 114 | +- **전역 변수 `i=1`** : 프로그램 전체에서 유효. `iGlobal()` 함수에서 접근 가능 |
| 115 | +- **main 함수 내의 지역 변수 `i=1`** : main 함수 내에서만 유효, 전역 변수와 이름이 같아도 다른 메모리 공간 사용 |
| 116 | +- **블록 내의 지역 변수 `register int i=2`** : 해당 블록 내에서만 유효, 블록을 벗어나면 소멸 |
| 117 | +- **iChange 함수 내의 static 변수** : 함수 내에서만 유효하지만, static 덕분에 함수 호출이 끝나도 값이 유지됨 |
| 118 | + |
| 119 | +--- |
| 120 | + |
| 121 | +## 4. `time.h` 라이브러리 (참고) |
| 122 | + |
| 123 | +C 언어에서 **날짜와 시간**을 얻거나 조작할 수 있는 표준 라이브러리입니다. |
| 124 | + |
| 125 | +- **주요 함수** |
| 126 | + - `clock()` : 프로그램 시작부터 경과된 시간을 밀리초(ms) 단위로 반환 |
| 127 | + - `time_t time()` : 현재 시간을 타임스탬프(Unix epoch 이후 초 단위)로 반환 |
| 128 | + |
| 129 | +> 정보 업데이트 로그 등에 적합합니다. |
| 130 | +
|
| 131 | +--- |
| 132 | + |
| 133 | +## 5. 결론 |
| 134 | + |
| 135 | +변수의 **유효 범위(지역/전역)**와 **저장 유형 지정자(auto, static, register)**는 |
| 136 | +C 프로그래밍에서 변수의 생명주기, 접근성 및 성능을 제어하는 데 필수적인 개념입니다. |
| 137 | + |
| 138 | +- 지역 변수는 함수나 블록 내에서 독립성을 보장 |
| 139 | +- 전역 변수는 프로그램 전체에서 공유되는 데이터를 다룰 때 사용 |
| 140 | +- static, register와 같은 저장 유형 지정자는 특정 변수에 대한 저장 방식과 생존 기간을 세밀하게 제어 |
| 141 | + |
| 142 | +이들을 이해하고 적절히 활용하는 것은 효율적이고 안정적인 코드를 작성하는 데 매우 중요합니다. |
0 commit comments