혼자 연구하는 C/C++ 7장 정리(기억 부류)

2015. 3. 1. 04:53창고

728x90
728x90

1. 지역변수

기억부류란?

기억부류(Storage Class)란 변수가 저장되는 위치에 따라 결정되는 변수의 여러 가지 성질을 의미한다.

전역변수와 지역변수

두 기억 부류의 차이점

- 변수의 선언 위치가 다르다.

- 변수의 통용 범위가 다르다. 

전역 변수는 함수 내부에 선언된 것이 아니므로 프로그램 전체가 공유한다.

지역 변수는 함수가 자신의 임무를 수행하기 위해 잠시 쓰고 버리는 것이다.

- 변수의 파괴 시기가 다르다.

변수는 메모리가 회수되면 변수 자체가 사라진다.

전역 변수는 프로그램이 종료되면 비로소 파괴된다. 프로그램과 운명을 같이 한다.

지역 변수는 함수가 끝나면 변수의 생명도 끝이난다. 함수와 운명을 같이한다.

- 변수가 생성되는 기억 장소가 다르다.

- 초기화 여부가 다르다. 전역변수는 자동으로 0으로 초기화, 지역변수는 쓰레기값을 넣어준다.


지역변수의 장점

- 함수의 독립성을 높인다. 전역변수로 서로 얼키고 설킨 구조는 좋은 프로그래밍이 아니다.

- 지역변수는 디버깅 효율을 향상시킨다. 

- 지역변수는 메모리를 절약한다.

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


외부변수

지정자(Specifier)는 기억 부류를 비롯하여 상수 지정, 최적화 금지 등 변수의 여러 가지 성질을 지정하는 키워드이다.

[지정자] 타입 변수명;

auto 키워드는 거의 사용되지 않는데 지정자는 생략되면 디폴트로 auto가 된다.


함수 내부에서 - auto로 인식하여 지역변가 된다.

함수 외부에서 - 전역변수로 선언된다.


2. 정적변수

정적변수

정적변수(Static Variable)는 전역변수와 지역변수의 성격을 동시에 가지는 좀 특별한 기억 부류이다.

- 선언 위치는 지역변수와 마찬가지로 함수의 선두이다.

- 통용 범위는 지역변수와 마찬가지로 함수 내부로 국한된다.

- 저장 장소는 전역변수가 저장되는 정적 데이터 영역이다.

- 정적 데이터 영역에 저장되므로 프로그램 실행 중에 항상 존재한다.

- 초기값 지정이 없으면 0으로 초기화되고 프로그램 실행시 단 한 번만 초기화된다.


정적변수 일때는 반드시 static이라는 지정자를 붙여야 한다.

정적변수 선언문에서 초기화 하지 않으면 전역변수와 마찬가지로 0으로 자동 초기화된다.


정적변수를 쓸 때 함수 내부에서 큰 배열을 선언하고 초기화할 때는 

초기화 시간을 절약하기 위해 정적으로 선언하여 한번만 초기화 하도록 한다.

그렇지 않으면 함수가 호출될 때마다 큰 배열이 매번 생성, 초기화, 파괴를 반복하므로 느려진다.


레지스터 변수

메모리의 한 구석에 생성되지 않고 CPU의 레지스터에 저장된다.

CPU의 레지스터 개수가 많지 않기 때문에 레지스터형 변수는 두 개까지만 선언할 수 있다.

레즈스터형 변수를 사용하는 이유는 조금이라도 빠른 속도를 내기 위함이다!


ex) 대규모 루프

1
2
3
4
5
6
7
8
register int i, j;
for(i = 0; i<10000000; i++)
{
    for(j = 0; j<1000; j++)
    {
        ...
    }
}
cs


하지만 요즘 CPU나 메모리가 워낙 빨라져서 루프를 도는 정도의 차이는 거의 실감하기 어렵다.


비주얼 C++는 register 지정자를 완전히 무시하며 전역 최적화 옵션에 따라 자동으로 레지스터형 변수를 관리한다.


정적 함수

C에서 함수는 모두 수평적이고 평등한 관계이다. 원칙적으로 모두 전역.

기억 부류 중에 함수에 적용되는 것은 정적(static) 기억 부류밖에 없다.

정적 함수는 특정 모듈에서만 사용할 수 있다.

재사용을 위해 작성한 모듈에서 ReadFile이라는 함수를 사용하는데 이 이름이

너무 일반적이어서 프로젝트내의 다른 함수명과 충돌이 될 것 같으면 이 함수를 static으로 선언한다.


3. 통용 범위

통용 범위 규칙

변수나 함수, 태그 같은 명칭은 상호 구분되어야 하므로 중복되어선 안 된다.


int i;

double i;

안됨!


1
2
3
4
5
6
7
8
9
10
11
12
13
int i = 3;
 
void main()
{
    printf i;
    func();
}
 
void func()
{
    int i = 5;
    printf i;
}
cs


출력은 i=3, i=5가 나온다.

둘 다 i를 사용해 모호하지만,

컴파일러는 하나의 명칭에 대해 통용 범위가 겹쳐 있을 경우 좁은 범위를 가지는 명칭에게 우선권을 줌으로써 모호성을 극복한다!

C++에선 ::범위 연산자를 통해 전역 변수를 접근한다. ::i


블록 범위

지역변수는 함수 내부에서 선언된 변수라고 했지만 정확히는 { } 괄호 안의 블록에 선언된 변수를 의미하며

변수가 선언된 블록 내부에서만 통용된다.


선언과 정의

선언(Declaration) : 컴파일러에게 대상에 대한 정보를 알린다. 

파일러에게 정보만 제공하는 것이므로 본체를 가지지 않아도 된다.

int Max(int, int);

정의(Definition) : 대상에 대한 정보로부터 대상을 만든다. 실제 대상을 만들기 때문에 중복되어서는 안된다.

전체 프로그램을 통해 단 한 번만 나타나야 하며 두 번 이상 중복할 필요가 없다.

int i;


설계원칙

- 함수의 이름을 최대한 설명적으로 작성하여 이름만으로 무엇을 하는 함수인지 알 수 있도록 한다.

GetScore, DrawScreen ..

- 두 번 이상 중복된 코드는 반드시 함수로 분리한다.

- 반복되지 않더라도 한 단위로 볼 수 있는 작업은 함수로 만든다.

- 함수는 단 한번에 하나의 작업을 해야 한다.

- 입력과 출력이 직관적이고 명확해야 한다.

- 함수는 자체적으로 에러 처리를 해야 한다.


728x90
반응형