07. 기억 부류

기억 부류

전역

지역

정적

레지스터

지정자

extern

auto

static

register

저장 장소

정적 데이터 영역

스택

정적 데이터 영역

CPU의 레지스터

선언 위치

함수의 외부

함수의 내부

함수의 내부

함수의 내부

통용 범위

프로그램 전체

함수의 내부

함수의 내부

함수의 내부

파괴 시기

프로그램 종료 시

함수 종료 시

프로그램 종료 시

함수 종료 시

초기 값

0

초기화되지 않음

0

초기화되지 않음

 

전역 변수와 지역 변수

지역 변수는 스코프를 벗어나면 바로 릴리즈 된다. 전역 변수는 프로그램 종료 시까지 유지된다. 따라서 되도록이면 지역 변수를 사용해서

  1. 함수의 독립성을 높이고
  2. 디버깅 효율을 향상시키고
  3. 메모리를 절약하고
  4. 재귀 호출이나 상호 호출 같은 기법을 구현하는데 제약이 없도록 한다.

외부 변수

스코프 상 지역 변수인 곳에서 전역 변수를 선언할 때

extern

을 사용한다. 전역변수를 사용하는 부분보다 더 앞쪽에서

extern

선언을 해야 하는 유일한 경우는 외부 모듈에 있는 전역 변수를 참조하고자 하는 경우 뿐이다.

정적 변수

static

으로 선언한다. 전역변수와 지역변수의 성격을 동시에 가지는 기억 부류이다. 함수의 선두에 지역변수처럼 선언되며 릴리즈 시점도 지역변수와 같다. 저장 장소는 전역 변수가 저장되는 정적 데이터 영역이다. 주로 모듈의 재활용성을 높이기 위해 사용한다. 이미 전역 변수가 사용되고 있을 때 충돌이 발생하는 것을 피할 수 있다.

레지스터 변수

컴퓨터 안에서 가장 속도가 빠른 레지스터 메모리에 변수를 할당하는 것이나, 실제로 CPU에 자리가 없다면 할당할 수 없고 현대의 컴파일러들은 옵션이 없을 때 이 선언을 무시한다. 무시하지 않고 사용된다고 해도 결과는 보통은 차이가 없고 가끔 더 느리거나 어쩌다가 더 빠를 때가 있는 터라 성능 향상을 기대하지 않는 것이 정신 건강에 이롭다.

정적 함수

함수 정의문 앞에

static

을 붙이는 것으로 정적 함수가 된다. 특정 모듈에서만 사용하도록 정의된 것이므로 외부에서 원형을 선언한다 하더라도 이 함수를 호출할 수 없다. 고로, 이름 충돌이 방지된다.

통용 범위

규칙

변수나 함수, 태그 같은 명칭은 상호 구분되어야 하므로 중복되어서는 안 된다. 그래서 같은 이름을 가진 두 개의 변수를 선언할 수 없다. 하지만 통용 범위가 다른 명칭끼리는 같은 이름을 가질 수도 있다. 가려져있는 전역 변수를 참조하기 위해서는 범위 연산자

::

을 사용한다.

블록 범위

for문과 같은 블록에서도 별도의 스코프를 가진다.

선언과 정의

역할 메모리 정보의 완전성 중복 가능성
선언 알린다 사용 안함 불완전해도 됨 가능
정의 생성한다 할당 항상 완전해야 함 불가능

 

정의는 실제 대상을 만들어내기 때문에 중복되어서는 안 된다. 선언은 정보를 알리기만 하기에 중복되어도 상관없다. 하지만 실제로는 명확하게 용어를 구분하지 않고 사용하는 경향이 있다.

설계 원칙

일반적으로 다음과 같은 원칙을 지켜주는 것이 노동량도 줄어들고 설계에 용이하다.

  1. 함수의 이름을 최대한 설명적으로 작성하여 이름만으로 무엇을 하는 함수인지 알 수 있도록 한다.
  2. 두 번 이상 중복된 코드는 반드시 함수로 분리한다.
  3. 반복되지 않아도 한 단위로 볼 수 있다면 함수로 만든다.
  4. 함수는 한번에 하나의 작업만 해야 한다.
  5. 입력과 출력이 직관적이고 명확해야 한다.
  6. 함수는 자체적으로 에러 처리를 해야 한다.

Leave a Reply