지역변수
- 전역변수와 지역변수
기억 부류(Storage Class)란 변수가 저장되는 위치에 따라 결정되는 변수의 여러 가지 성질을 의미함. 변수가 어디에 생성되는가에 따라 통용 범위와 파괴 시기 등의 특징이 결정됨.
전역변수의 메모리는 프로그램이 종료되면 파괴됨.
전역변수는 정적 데이터 영역에 생성됨. 정적 데이터 영역이란 프로그램의 코드 바로 다음에 위치하는 실행 파일의 한 부분인데 프로그램이 실행될 때 메모리로 로드되어 실행 중에 계속 유지됨. 지역변수는 스택에 생성됨. 전역변수는 별도의 초기화가 없어도 0으로 초기화됨.
- 지역변수의 장점
1. 함수의 독립성을 높임
2. 지역변수는 디버깅 효율을 향상시킴
3. 지역변수는 메모리를 절약함
4. 재귀 호출이나 상호 호출 같은 특별한 기법은 지역변수가 있어야만 사용가능
- 외부변수
일반 변수 선언시 " 타입 변수명;" 형식을 사용했는데 이 형식을 한 단계 확장한 것이 외부변수임.
외부변수 형식
[지정자] 타입 변수명;
정적변수
- 정적변수
정적변수(Static Variable)는 전역변수와 지역변수의 성격을 동시에 가지는 좀 특별한 기억 부류.
정적변수의 특징
- 레지스터 변수
레지스터형 변수는 앞에서 논한 세 개의 기억 부류와 좀 다른 유별난 점이 있음. 지역, 전역, 정적변수들은 정적 데이터 영역이든 스택이든 어쨌든 메모리의 한 구석에 생성되지만 레지스터형 변수는 메모리가 아닌 CPU의 레지스터에 저장됨.
레지스터 변수 선언 형식
register 타입 변수명; // 실수형은 불가능
- 정적 함수
기억 부류는 주로 변수에 대해 적용되지만 함수도 기억 부류를 가짐. 함수에는 전역이니 지역이니 하는 개념은 존재하지 않으며 레지스터형 기억 부류도 당연히 없음. C의 함수는 모두 수평적인 평등 관계이며 어떤 함수를 다른 함수의 지역 함수로 선언하는 것은 허용하지 않음.
정적 함수의 예
static void func()
{
...
}
통용 범위
- 통용 범위 규칙
변수나 함수, 태그 같은 명칭은 상호 구분되어야 하므로 중복되어서는 안 됨. 그래서 같은 이름을 가진 두 개의 변수를 선언할 수 없음.
통용 범위가 겹쳐 있을 경우 좁은 범위를 가지는 명칭에게 우선권을 줌.
전역변수가 지역변수에 의해 가려진 경우는 범위 연산자(::)를 사용하면 전역 변수를 사용 할 수 있음.
ex) printf("%d", ::i); // 지역변수 i가 아닌 전역변수 i를 참조
- 블록 범위
통상 말하는 중괄호 { , } 로 둘러쌓인 범위를 블록 범위라 함.
- 선언과 정의
- 설계 원칙
1. 함수의 이름을 최대한 설명적으로 작성하여 이름만으로 무엇을 하는 함수인지, 이왕이면 어떻게 쓰는 것인지도 알 수 있도록 해야함.
2. 두 번 이상 중복된 코드는 반드시 함수로 분리.
3. 반복되지 않더라도 한 단위로 볼 수 있는 작업은 함수로 제작.
4. 함수는 한 번에 하나의 작업만 해야함.
5. 입력과 출력이 직관적이고 명확해야함.
6. 함수는 자체적으로 에러 처리를 해야 함.