→저번에 보고 넘어간것들
■ 함수 개요
■ 표준 라이브러리 함수
■ 함수의 선언, 정의, 호출
■ 재귀(recursive) 함수
■ 매개변수 전달 방법 : call by value
■ 구조적 프로그래밍
▶ 이번주에 보고 넘어갈것들
■ 지역 변수와 전역 변수
■ 자동(auto) 변수
■ 레지스터(register) 변수
■ 정적(static) 변수
■ extern 변수
■ 변수와 메모리 영역
지역(local) 변수와 전역(global) 변수
변수의 유효범위(scope)란 프로그램 내에서 변수가 사용될 수 있는 범위
(C 언어에서는 지역(local)과 전역(global) 이라는 개념으로 변수가 사용될 수 있는 범위를 지정)
지역 변수는 해당 함수나 블록({ }) 내에서만 사용할 수 있음
전역 변수는 소스 전체에서 사용할 수 있음
지역 변수와 전역 변수는 변수의 선언 위치에 따라서 결정됨
함수나 블록 안에서 변수를 선언하면 그 변수는 지역 변수가 되고, 함수 (보통 main()함수)밖에서 선언하면 전역 변수가 됨
코드 영역과 데이터 영역
C 프로그램은 소스와 프로그램에서 사용할 데이터로 구성됨
소스는 컴파일과 링킹 과정을 거쳐 기계어로 번역됨
기계어로 번역된 코드는 메모리의 코드(code)영역에 저장됨
코드 영역은 저장된 내용을 읽기만 가능하고 쓰기가 불가능한 메모리 영역
프로그램에서 사용할 변수 등의 데이터는 읽기 쓰기가 가능한 데이터 영역에 저장됨
데이터 영역은 비초기화된 데이터가 저장되는 bss와 초기화된 데이터가 저장되는 데이터 영역으로 나눔
auto 지역 변수는 스택 영역을 사용하고 전역 변수는 데이터 영역을 사용
12-1. 지역 변수의 유효범위
12-2. main() 함수와 add() 함수의 x,y
12-3. 전역 변수와 지역 변수
전역 변수는 함수 밖에서 선언하며, 프로그램의 모든 부분에서 사용할 수 있음
데이터 영역을 사용하며 프로그램 실행이 종료될 때까지 값을 유지
실행시 한번만 초기화하고 초깃값이 주어지지 않으면 0으로 자동 초기화
지역 변수와 중복해서 선언되어 있으면 지역 변수 값이 우선임
기억 클래스 : 자동(auto)
가장 많이 사용하는 기억 클래스
int형 변수 a를 auto변수로 선언
auto int a; //auto는 생략이 가능하여 이 선언문은 int a;와 같은 문장임
지금까지는 그냥 "int a;"형태로 자료형만 명시했는데 자료형인 int앞에 기억 클래스를 나타내는 auto를 더 쓰면 됨
auto변수의 특징
1. 함수 또는 블록의 내부에서 선언
2. 해당 함수나 블록 내에서만 유효한 지역(local)변수
3. 기억 클래스가 명시되지 않고 선언된 변수는 모두 자동 변수 즉, auto는 생략이 가능 그래서 지금까지 기억 클래스를 쓰지 않고 사용한 모든 변수는 auto변수
4. 스택(stack) 공간을 일시적으로 사용
5. 함수나 블록을 진입하면 기억 영역이 확보되고, 벗어나면 기억 영역은 바로 소거됨 단, return문으로 리턴된 값은 스택에 복사되어 외부로 전달됨
6. 초기화는 실행시 이루어지며, 초기화하지 않으면 임의의 값(쓰레기 값, garbage value)을 가짐
12-4. auto 변수
기억 클래스 : 레지스터(register), 정적(static) 변수
→ 레지스터 변수
레지스터는 CPU가 연산시 데이터를 임시로 저장하는데 사용하는 작고 빠른 기억 장소
int형 변수 a를 register변수로 선언
(register int a;)
register변수는 auto변수와 동일한 특징
[다만 스택이 아니라 CPU 내의 레지스터(register)에 저장하여 고속 처리가 가능]
정수형, 포인터 등 4바이트 데이터만 저장이 가능
두 개까지만 선언할 수 있고, 초과된 변수는 auto로 지정됨
[Intel CPU에서는 인덱스 레지스터 ESI(Extended Source Index)와 EDI(Extended Destination Index)에 저장됨]
레지스터에는 주소가 없으므로 주소 참조가 불가능
매우 단순하면서 엄청난 횟수를 반복할 필요가 있는 루프의 변수를 register변수로 지정하면 고속 처리를 할 수 있음
컴파일러가 최적화 과정에서 적절한 변수를 레지스터 변수로 만들기 때문에 일부러 지정할 필요는 없음
(Visual C++에서는 register를 무시하고 최적화 옵션으로 자동으로 관리)
→ 정적 변수
int형 변수 a를 정적(static)변수로 선언
(static int a;)
자료형인 int앞에 기억 클래스를 나타내는 static을 더 쓰면 됨
static변수의 특징
1. 프로그램이 종료될 때까지 값을 유지
2. 처음 실행시 한번만 초기화되고 초기화 값이 없으면 0으로 초기화됨
3. 스택이 아닌 정적 데이터 영역을 사용
4. 지역 static변수는 해당 블록 내에서만 접근 가능
static변수는 윈도우즈 프로그래밍할 때 많이 사용하므로 그 특징을 잘 알고 있어야 함
전역 변수는 기본적으로 static이므로 static키워드 필요 없음
12-5. auto 변수와 static 변수
지역 static변수는 지역 변수로 해당 블록 내에서만 유효하지만,
정적 데이터 영역에 자료를 저장하여 프로그램 종료될 때까지 값을 유지
또한 처음 실행시 한번만 초기화됨(실행파일에 y는 10이라는 값으로 되어 있어서, 프로그램이 실행하는 순간 y는 10)
기억 클래스 : extern 변수
전역 변수는 함수 외부에 선언되는 변수이며 프로그램의 모든 부분에서 사용할 수 있음
전역 변수는 다음과 같이 extern을 쓸 수 있음
(extern int x;)
이렇게 선언된 extern변수는 해당 파일에 실제로 있는 변수가 아니라 프로그램의 다른 파일에 선언된 변수인데 해당 파일에서 사용할 수 있게 함
덩치가 큰 상용 프로그램은 하나의 소스 파일로 관리하지 않고 여러 개의 모듈 소스로 나누어 관리하는데 각 모듈 소스는 각각 컴파일을 한 후에 하나의 실행파일로 합쳐짐
사용법 예시
다른 파일에 선언된 loop변수를 main.c에서 사용하겠다는 뜻
실제 loop변수는 start.c파일에 있음
extern으로 선언된 변수는 기억 장소가 할당되지 않음
12-6. 변수와 메모리 영역
8 : auto변수 ax와 ay의 값과 주소를 출력. 스택 영역의 주소
9: 전역 변수 gx와 gy의 값과 주소를 출력. 데이터 영역의 주소
10 : static변수 sx와 sy의 값과 주소를 출력. 데이터 영역에 할당됨
기억클래스 정리
기억 클래스(auto, register, 지역 static)에 따른 변수들의 선언위치,
유효 범위, 파괴 시기, 초기값, 저장 장소
전역 변수의 특징도 비교를 위해서 함께 표시
해당 내용은 인덕대학교 2021년도 1학기 C프로그래밍 한성현 교수님 강좌에서 발췌한 내용입니다.
강좌 내용을 원저작자 허락없이 무단 이용시, 처벌의 대상이 될수 있습니다.
'C > C' 카테고리의 다른 글
C언어 심화 (14주차) [구조체, 총정리 1] (0) | 2022.06.11 |
---|---|
C언어 심화 (13주차) [배열(array)] (0) | 2022.05.29 |
C언어 심화 (11주차) [함수] (0) | 2022.05.27 |
C언어 10주차 (제어문 4) [while, do ~ while, break, continue, goto] (0) | 2022.05.26 |
C언어 9주차 (제어문3) [Switch - case, For] (0) | 2022.05.10 |
댓글