끄적끄적

반응형

1. 기억 클래스의 정의 

기억 클래스라는 것은 C언어에서 변수나 함수가 어디에 만들어지며 어디까지 사용가능 한 것인지를 결정하는 것을 말합니다. 


 

u 기억 클래스의 형식 


[형 식]

[기억 클래스 지정자] 변수;


[예]

auto int a; 

extern int a; 

static int a; 

register int a; 

 

 

u 기억 클래스 지정자의 종류 


기억 부류

전역

지역

정적

레지스터

지정자

extern

auto

static

register

저장 장소

정적 데이터 영역

스택

정적 데이터 영역

레지스터

선언 위치

함수의 외부

함수의 내부

함수의 내부

함수의 내부

범위

프로그램 전체

함수의 내부

함수의 내부

함수의 내부

파괴 시기

프로그램 종료시

함수 종료시

프로그램 종료시

함수 종료 시

초기값

0으로 초기화

초기화되지 않음

0으로 초기화

초기화되지 않음

 

 

 

u 전역 변수와 지역 변수의 차이점 

전역변수는 함수 바깥에서 선언하고 지역변수는 함수 내부에서 선언합니다. 

전역변수는 특정한 함수 내부에서 선언된 것이 아니므로 함수에 속하지 않고 프로그램 전체가 공유합니다. 

따라서 변수가 선언된 위치 이후에는 어디서든지 이 변수를 사용할 수 있습니다. 

지역변수는 자신이 선언된 함수에 소속되어 있기 때문에 함수 외부에서는 이 변수를 사용할 수 없습니다. 

변수의 값을 읽지도, 쓰지도 못하며 변수의 존재 자체가 알려지지 않기 때문에 이 변수를 사용하는 것이 허용되지 않습니다. 

지역변수는 함수가 자신의 임무를 수행하기 위해 잠시 사용하고 삭제하는 것입니다. 

전역변수는 한 번 정해진 메모리 위치에 계속 남아 있어야 하므로 정적 데이터 영역에 생성됩니다. 

정적 데이터 영역이란 프로그램의 코드 바로 다음에 위치하는 실행 파일의 한 부분인데 프로그램이 실행될 때 메모리에 load되어 실행 중에 계속 유지됩니다. 

지역변수는 프로그램 실행 중에 생성, 파괴를 반복하므로 스택에 생성됩니다. 

전역변수는 별도의 초기식이 없더라도 0으로 초기화됩니다. 

지역변수는 별도의 초기식이 없을 경우 초기화되지 않고 쓰레기 값을 가지고 있습니다. 

지역변수를 사용하지 않고 모든 변수를 전역으로 사용해도 프로그램은 만들 수 있습니다. 

어셈블리에서는 사실 변수라는 개념 자체가 없고 모든 것이 메모리 주소이기 때문에 모든 값은 전역입니다. 

스택에 의도적으로 임시 변수를 생성할 수는 있습니다. 

고전적인 베이직 언어에서도 지역변수라는 것이 없습니다. 

하지만 C나 파스칼, 자바, 비주얼 베이직 같은 근대적인 언어들은 모두 지역변수의 개념을 지원합니다. 

심지어는 PHP나 ASP, 자바 스크립트 같은 스크립트 언어들까지도 지역변수를 지원합니다. 

언어들이 지역변수를 지원하는 이유는 프로그램의 구조화에 큰 도움을 주고 유지, 보수를 쉽게 해주는 등의 여러 가지 장점이 있기 때문입니다.  


1. 함수의 독립성을 높이게 됩니다. 

구조적 프로그램은 함수로 구성되고 함수는 프로그램의 부품이라고 할 수 있습니다. 

부품은 불가피한 경우를 제외하고는 가급적이면 스스로 작동할 수 있도록 만들어야 재활용하기 좋습니다. 

부품끼리 공유하는 것(전역변수)이 많아지다 보면 의존 관계를 가지게 되므로 서로 종속적이 되서 좋지 않은 구조를 만들어 냅니다. 


2. 지역변수는 디버깅 효율을 향상시킵니다. 

버그, 즉 논리적인 에러가 발생하는 원인의 가장 큰 요인 중 하나가 변수를 잘못 조작한 경우입니다. 

전역변수를 너무 많이 사용하다 보면 디버깅을 할 때 살펴 봐야 할 변수의 수가 많아집니다. 

프로그램 하나를 만들기 위해서 필요한 변수는 보통 수 백개, 많으면 수 천개가 되는데 이 변수들이 전부 다 전역이라면 디버깅은 정말 끔찍한 작업이 될 것입니다. 

더구나 전역변수는 통용 범위가 프로그램 전체이기 때문에 어떤 함수가 이 변수를 잘못 건드렸는지 찾아내기가 아주 어렵습니다. 

그러나 지역변수는 디버깅하기 아주 쉽습니다. 

일단 지역변수를 많이 쓰면 전역변수의 수가 상대적으로 줄어들게 되므로 관찰 대상 변수의 범위가 대폭 좁아지게 됩니다. 


3. 지역변수는 메모리를 절약합니다. 

전역변수는 프로그램이 실행될 때 같이 생성되며 계속 값을 유지해야 하므로 그만큼의 메모리를 항상 차지하게 됩니다. 

지역변수는 함수가 호출될 때만 생성되며 함수가 종료되면 즉시 파괴되므로 자신이 속해 있는 함수가 실행 중 일 때만 메모리를 차지합니다. 


4. 재귀 호출이나 상호 호출 같은 특별한 기법은 지역변수가 있어야만 사용할 수 있습니다. 

재귀 호출이 가능하기 위해서는 각 호출 시마다 고유의 값을 유지해야 하는데 전역변수로는 이런 기법을 구사할 수 없습니다.

반응형
Please Enable JavaScript!
Mohon Aktifkan Javascript![ Enable JavaScript ]