9.1 변수의 속성
변수 속성
접근 범위(scope): 변수가 어떤 범위에서 사용이 가능한가
생존 시간(lifetime): 변수가 메모리 상에 얼마나 존재하는가
연결 상태(linkage): 다른 파일의 변수들과 연결되어 있는가
9.2 지역 변수
지역 변수(local variable)
함수 또는 블록 안에서 정의되며 그 안에서만 사용 가능
지역 변수 선언 위치
블록의 어디서든지 변수 선언 가능
이름이 같은 지역 변수 가능
지역 변수의 초기값
지역 변수의 초기값을 정해주지 않으면 쓰레기 값이 들어감
함수의 매개변수
함수 호출 시 인수 값으로 초기화되는 지역 변수
9.3 전역 젼수
전역 변수
함수 외부에서 선언되며 소스 파일 어디에서나 사용 가능
전역 변수의 초기값
전역 변수를 초기화하지 않으면 0으로 초기화
전역 변수의 생존 기간
프로그램 시작과 동시에 생성되어 종료되기 전까지 메모리에 존재
전역 변수의 사용
공통 데이터만 전역 변수로 선언
일부 데이터는 함수의 인수로 전달
스파게티 코드
전역 변수들로 인하여 코드가 꼬이 는 현상
같은 이름의 전역 변수와 지역 변수
지역 변수가 전역 변수보다 우선시 됨
9.4 생존 시간
정적 할당
프로그램 실행 시간 동안 계속 유지
자동 할당
블록에 들어갈 때 생성되고 블록에서 나올 때 소멸
생존 기간을 결정하는 요인
변수가 선언된 위치
저장 유형 지정자
저장 유형 지정자
auto
register
static
extern
auto 지정자
자동 변수(automatic variable)
변수를 선언한 위치에서 자동으로 생성되고, 블록을 벗어나면 자동으로 소멸
지역 변수는 auto가 생략되어도 자동 변수
static 지정자
정적 변수(static variable)
지역 변수처럼 블록에서만 사용되지만, 블록을 벗어나도 제거되지 않는 변수
프로그램이 시작될 때 메모리에 생성되고, 프로그램이 종료되면 제거
초기값을 지정하지 않으면 0으로 초기화
초기화는 딱 한 번만 수행
register 지정자
레지스터 변수(register variable)
변수를 메모리에 저장하는 것이 아니라 레지스터에 저장 (레지스터 변수)
최근 컴파일러는 향상된 최적화 과정을 통해 레지스터 사용
주소를 추출하는 & 연산자 적용 시 컴파일 오류 발생
volatile 지정자
컴파일러가 volatile 변수 관련 문장을 최적화하지 말라고 지시할 때 사용
하드웨어가 수시로 변수의 값을 변경하는 경우에 사용
9.5 연결
연결
다른 범위에 속하는 변수들을 서로 연결하는 것
전역 변수만이 연결 가능
연결 유형
무연결: 지역 변수로서 외부와 연결을 가지지 않음
외부 연결: 전역 변수로서 여러 개의 소스 파일에 걸쳐 사용
내부 연결: 전역 변수로서 하나의 소스 파일에서만 사용 가능
외부 연결
전역 변수를 extern을 사용하여 서로 연결
내부 연결
전역 변수 앞에 static을 붙이면 하나의 소스 파일 안에서만 사용 가능
static 함수
static 함수는 소스 파일 안에서만 사용 가능
9.6 어떤 저장 유형을 사용하여 하는가?
저장 유형
일반적으로는 자동 저장 유형 사용을 권장
함수 호출이 끝나도 변수의 값을 유지해야 하면 지역 정적 사용
만약 많은 함수에서 공유되어야 하는 변수라면 외부 참조 변수로 사용
9.7 가변 매개 변수 함수
가변 매개변수 함수
매개 변수의 개수가 가변적으로 변할 수 있는 기능
int sum(int, ...);
가변 매개변수 함수 선언
가변 매개변수 함수의 원형은 ...을 이용해 선언
va_start()를 호출하여 가변 매개변수 기능 시작
가변 매개변수 함수의 첫 번째 인수는 매개변수의 개수
va_arg()를 호출할 때마다 인수들이 하나씩 반환
var_arg()를 호출할 때 va_list 타입의 변수와 인수의 타입을 전달
인수의 개수만큼 va_arg() 호출
va_end(va_list)를 호출하여 가변 매개변수 기능 종료
9.8 순환 호출
순환(recursion)
함수가 자기 자신을 호출하여 문제를 해결하는 프로그래밍 기법
순환의 예
팩토리얼: 팩토리얼을 정의하는데 다시 팩토리얼을 사용
순환 함수의 구조
int factorial(int n)
{
if (n <= 1) return (1); // 순환을 멈추는 부분
else return (n * factorial(n - 1)); // 순환 호출을 하는 부분
}
Advanced Topic
스텁(stub) 기법
함수의 외부 인터페이스만을 구현한 것
스텁 기법의 예
#include <stdio.h>
double get_pc_temp();
int main(void)
{
double temperature;
temperature = get_pc_temp();
if( temperature >= 50 )
printf("과열되었습니다\n");
return 0;
}
double get_pc_temp()
{
printf("get_pc_temp()가 호출되엇습니다.\n");
return 49.0; // 임시로 실제 하드웨어 온도 대신 49.0을 반환
}
실제로는 get_pc_temp()는 pc 하드웨어로부터 온도를 읽어야 하지만, 아직 코드가 준비되지 않았기 때문에 임시로 49.0이라는 고정된 값을 반환한다.
이 스텁 함수를 사용하면 프로그램의 다른 부분들이 맞게 동작되는지를 검사할 수 있다.
'잠든 카테고리 > 쉽게 풀어쓴 C언어 Express' 카테고리의 다른 글
11-11.1(포인터란?)~11.7(포인터 사용의 장점) (0) | 2022.06.14 |
---|---|
10-10.1(배열이란?)~10.6(2차원 배열) (0) | 2022.06.10 |
08-8.1(함수란?)~8.7(함수를 사용하는 이유)+Advanced Topic (0) | 2022.06.09 |
07-7.1(반복의 개념)~7.7(break와 continue) (0) | 2022.04.28 |
06-6.1(제어문)~6.6(goto 문) (0) | 2022.04.28 |