티스토리 뷰
2021.03.01.월
지역 변수
✔ 지역 변수는 예약어 auto와 함께 선언하며, 생략 가능하다. 자동 초기화되지 않는다.
✔ 지역 변수는 블록 내부로 제한되므로, 다른 함수에서 사용할 수 없다.
✔ 블록 범위는 중괄호를 기준으로 결정된다.
✔ 각 각 독립된 저장 공간이기 때문에 다른 함수에 같은 이름의 변수를 선언해도 충돌하지 않는다.
#include <stdio.h>
void swap(int a, int b);
int main(void){
int a = 10;
int b = 20;
swap(a,b);
printf("a = %d, b = %d\n",a,b);
// a = 10, b = 20 → 값이 그대로인걸 확인할 수 있다.
}
void swap(int a, int b){
int temp = a;
a = b;
b = a;
}
✔ 지역변수를 선언한 함수 내부에서만 사용되므로, 함수가 종료되면 저장 공간을 회수하게 된다.
✔ 그렇기 때문에 저장 공간을 효율적으로 사용할 수 있다.
✔ 지역변수가 사용되는 영역이 정해져 있으므로, 값에 문제가 있을 때 찾아서 수정하기 쉬워서 디버깅에 유리하다.
✔ 다른 함수와 변수의 값을 공유하기 어렵지만 장점이 더 많으므로 지역 변수를 더 많이 사용한다.
블록 안에서 사용하는 지역 변수
✔ 지역 변수는 일반적으로 함수 내부에서 선언하고, 함수의 종료 시까지 사용한다.
✔ 함수 내부에 있는 중괄호 내부에서 변수를 선언하면, 중괄호 내부의 변수는 중괄호가 닫히는 순간까지 사용한다.
#include <stdio.h>
int main(void){
int a = 10;
int b = 20;
//함수 내부에 새로운 블록을 설정
{
int a = 30;
int b = 40;
printf("메인 함수 내부에 새로운 블록에서 선언한 a의 값은 %d\n", a);
printf("메인 함수 내부에 새로운 블록에서 선언한 b의 값은 %d\n", b);
}
printf("메인 함수 내부에 선언한 a의 값은 %d\n", a);
printf("메인 함수 내부에 선언한 b의 값은 %d\n", b);
return 0;
}
✔ 지역 변수는 일반적으로 함수 내부에서 선언하고, 함수의 종료 시까지 사용한다.
✔ 함수 내부에 있는 중괄호 내부에서 변수를 선언하면, 중괄호 내부의 변수는 중괄호가 닫히는 순간까지 사용한다.
✔ 만약 범위가 겹치는 같은 이름의 변수가 둘 이상이라면, 가장 가까운 블록에 선언된 변수를 사용한다.
전역 변수
✔ 메인 함수의 바깥에 변수를 선언하게 되면, 중괄호로 범위를 지정하지 않았기 때문에 특정 함수에 포함되지 않는다.
✔ 메인함수의 바깥에 선언된 변수는 전역 변수라고 하며 사용 범위는 프로그램 전체가 된다..
✔ 즉, 프로그램이 실행될 때 메모리에 할당되고 프로그램이 끝날 때까지 존재한다.
✔ 전역 변수에 버그가 발생하거나 변수명을 수정한다면 프로그램의 모든 코드를 수정 및 확인해야한다는 단점이 있다.
#include <stdio.h>
//전역 변수
int a;
int b;
void swap();
int main(void){
a = 10;
b = 20;
swap();
printf("a = %d, b = %d\n",a,b);
//a = 20, b = 10
}
void swap(){
int temp = a;
a = b;
b = temp;
}
✔ 변수 a와 b는 전역 변수이므로 메인 함수와 swap 함수 모두에서 접근할 수 있다.
✔ 즉, 전역 변수 a와 b를 사용하므로 swap함수에는 매개변수가 필요 없다.
✔ 그리고 매개 변수의 이름을 a와 b로 설정할 수 없는데, 이미 같은 이름의 전역 변수가 존재하기 때문이다.
✔ 만약 블록 내에 같은 이름의 지역 변수를 사용하면, 해당 블록에서는 전역 변수를 사용할 수 없다.
✔ 0으로 자동 초기화 된다.
정적 지역 변수
✔ 지역 변수를 선언할 때, static 예약어를 사용하면 정적 지역 변수가 된다.
✔ 정적 지역 변수는 일반 지역 변수와 마찬가지로 사용 범위가 블록 내부로 제한된다.
#include <stdio.h>
int sum(int n);
int main(void){
int n = 2;
for(int i=1; i<4; i++){
printf("%d번째 getsum 함수 호출 : %d\n",i,sum(n));
}
return 0;
}
int sum(int n){
static int sum;
sum += n;
return sum;
}
✔ 정적 지역 변수는 프로그램 실행과 동시에 메모리 공간이 할당되며, 종료 시 메모리 공간이 해제된다.
✔ 일반 지역 변수와 달리 정적 지역 변수는 함수가 종료되더라도 저장 공간을 그대로 유지한다.
✔ 하나의 함수가 여러 번 호출되는 경우 같은 변수를 공유하는 것이 가능하다.
✔ 정적 지역 변수는 초기화를 별도로 하지 않는다면 0으로 자동 초기화된다.
[참고] 한빛미디어-혼자 공부하는 C언어 유튜브 강의 / 엘리스 트랙-혼자 공부하는 C언어 / 길벗-C언어 코딩 도장 / 위키백과
'BackEnd > C' 카테고리의 다른 글
[19일차] 1. 2차원 배열 (0) | 2021.03.02 |
---|---|
[18일차] 2. 레지스터 변수/주소를 반환하는 함수 (0) | 2021.03.01 |
[15일차] 문자열 관련 함수의 원형 (0) | 2021.02.25 |
[13-14일차] 문자/문자열 (0) | 2021.02.25 |
[13일차] 배열과 포인터 (0) | 2021.02.23 |