변수는 사용 범위와 메모리에 존재하는 기간에 따라 종류가 다양하다.
지역변수 Local Variable
지녁 변수는 함수 내(일정 지역)에서만 사용하는 변수이다.
지역 변수는 사용 범위가 블록 내부로 제한되므로 다른 함수에서는 사용할 수 없다. 따라서 다른 함수에서 같은 이름의 변수를 선언해도 충돌하지 않는다.
지역 변수는 이름이 같아도 선언된 함수가 다르면 각각 독립된 저장 공간을 갖는다. 즉, 두 함수에 선언된 변수 a는 이름만 같을 뿐 메모리에 별도의 저장 공간을 갖는다.
지역 변수 사용의 장점: 지역 변수의 사용 범위를 함수 단위로 제한하고 독립된 저장 공간을 확보하면 두 가지 장점이 있다.
1) 메모리를 효율적으로 사용한다.
2) 디버깅에 유리하다.
** 함수의 매개 변수 역시 지역변수이다. 함수를 만들 때 괄호 안에 선언하는 매개변수는 호출할 때 전달되는 값을 받기 위해 특별한 위치에 선언하는 것일 뿐 사용 범위나 메모리에 존재하는 기간 등 변수가 갖는 모든 특징은 지역 변수와 같다.
블록 안에서 사용하는 지역 변수
1) 특정 블록 안에 변수를 선언하면 사용 범위가 블록 내부로 제한된다.
2) 사용 가능한 변수가 둘 이상이면 가장 가까운 블록에 선언된 변수를 사용한다.
전역 변수 Global Variable
함수 밖에 선언하면 전역 변수가 된다. 특정 함수의 블록에 포함되지 않으므로 사용 범위가 함수나 블록으로 제한되지 않는다.
전역 변수와 같은 이름의 지역 변수
이 경우 지역 변수를 먼저 사용한다.
전역 변수의 문제점
전역 변수의 이름을 바꾸면 그 변수를 사용하는 모든 함수를 찾아 수정해야한다.
전역 변수의 값이 잘못된 경우 접근 가능한 모든 함수를 의심해야한다.
코드 내 같은 이름의 지역 변수를 선언하면 그 영역에서는 전역 변수를 사용할 수 없다.
*** 전역 변수는 많은 함수에서 수시로 데이터를 공유하는 경우 제한적으로 사용하는 것이 좋다.
정적 지역 변수
지역 변수를 선언할 때 Static 예약어를 사용하면 정적 지역 변수가 된다. 정적 지역 변수는 코드 블록 안에 선언하므로 일반 지역 변수와 같이 사용 범위가 블록 내부로 제한된다. 정적 지역 변수는 선언된 함수가 반환되어도 그 저장 공간을 계속 유지한다. 그래서 함수에 필요한 값을 보관하여 호출시마다 계속 사용할 수 있다.
레지스터 변수 Register Variable
블록/함수 내에 변수를 선언할 때 register 예약어를 사용한다.
지역 변수와 레지스터 변수의 차이는 무엇일까?
레지스터 변수의 특징은 저장 공간이 할당되는 위치에 있다. 레지스터 변수는 CPU 안에 있는 저장 공간인 레지스터를 사용한다. 레지스터는 CPU 안에 있어 데이터 처리 속도가 가장 빠른 저장 공간이다. 자주 사용하는 변수를 레지스터 변수로 사용하면 저장 공간이 램에 있을 때보다 빨라 프로그램 실행 시간을 줄일 수 있다.
레지스터 변수 사용 시 주의점
1. 전역 변수는 레지스터 변수로 선언할 수 없다.
2. 레지스터 변수는 포인터를 구할 수 없다. - 레지스터 변수는 저장 공간이 메모리에 있는 것이 아니기 때문이다.
3. 레지스터의 사용 여부는 컴파일러가 결정한다.
- 레지스터 변수를 선언했다고 모두 레지스터에 변수가 생기는 것은 아니다. 당장 연산할 필요가 없는 데이터를 레지스터에 보관하면 레지스터의 활용성이 떨어지므로 컴파일러는 사용자가 레지스터 변수를 선언하더라도 레지스터와 메모리 중에 어디에 할당하는 것이 더 이득인지 판단하여 적당한 저장 공간을 선택한다.
'공부 STUDY > C | C++' 카테고리의 다른 글
[ C ] 응용 포인터 | 포인터의 주소는? | 부분 배열의 주소 | 2차원 배열의 배열명 | 배열 포인터 (0) | 2023.01.29 |
---|---|
[ C ] 주소와 포인터 차이? | 포인터의 크기 | 포인터 자료형 | 포인터 기능 (0) | 2023.01.28 |
[ C ] 포인터란? 메모리 주소 | 포인터 연산자( &, *) (0) | 2023.01.28 |
[ C ] 문자를 저장하는 배열 | char 형 배열 | 문자열 대입 방법 | strcpy(), gets(), puts() (0) | 2023.01.28 |
[ C ] 배열 | 배열의 선언과 사용 (0) | 2023.01.28 |