A. 유효범위와 연결
1. 변수와 유효 범위
a. 유효 범위(scope)
🌟 하나의 변환 단위(translation unit) 내에서 해당 변수가 사용될 수 있는 범위
함수 내에서 선언된 변수는 함수 내에서만 사용
밖에서 선언된 변수는 선언된 이후에 나오는 함수에서 모두 사용 가능
💙 Info
C++에서는 파일(file) 용어 대신 변환 단위(translation unit)라는 용어를 사용
b. 연결(linkage)
🌟 해당 변수를 사용할 수 있는 파일의 접근 가능 여부
함수 내에서 선언된 변수는 함수 밖에서는 사용할 수 없으므로 연결 ❌
- 외부 연결(external linkage)을 가지는 변수 : 여러 파일에서 사용
- 내부 연결(internal linkage)을 가지는 변수 : 하나의 파일에서만 사용
2. C++ 변수의 종류
변수는 유효범위와 연결을 기준으로 아래와 같이 나눔
a. 자동 변수(automatic variable)
🌟 블록 내에서 선언된 변수를 의미하며, 함수의 매개변수도 여기에 포함
- 유효범위 : 선언된 블록 내부
- 메모리 : 종료되면 stack 메모리에서 사라짐
- 초기화 : 하지 않으면 쓰레기값으로 초기화
- C언어의 지역변수와 같은 의미로 사용
💥 변수의 이름 주의사항
같은 이름을 여러번 사용 ❌
같은 이름의 변수를 또 선언하려고 하면 오류
b. 레지스터 변수(register variable)
🌟 변수를 선언할 때 register 키워드를 붙여 선언한 변수
- 메모리 : CPU의 레지스터(register) 메모리에 저장되어 빠르게 접근
- 💥 컴퓨터의 레지스터는 매우 작아 선언하기 힘든 경우 그냥 지역 변수로 선언
- C++11 부터는 단순히 변수가 자동 변수라는것을 의미함
c. 정적 변수
🌟 정적 변수는 프로그램이 실행되는 내내 유지되는 변수
- 메모리 : data 영역에 저장
- 초기화 : 하지 않으면 0으로 자동 초기화
1) 연결을 가지지 않는 정적 변수
🌟 블록 내부에서 static 키워드를 사용하여 정의
- 전역변수처럼 단 한번 초기화, 종료되어야 메모리에서 사라짐
- 지역변수처럼 해당 블록 내에서만 접근 가능
⏳ 예제 : 연결을 가지지 않는 정적 변수
void StaticVar(void)
{
static int static_count = 1; //외부에서 호출 불가능
cout << "StaticVar() 함수가 " << static_count << " 번째 호출되었습니다." << endl;
static_count++; //함수 실행시마다 count++
}
2) 내부 연결을 가지는 정적 변수
🌟 유효 범위를 변환 단위로 가지는 변수에 static 키워드를 사용하여 정의
- 해당 변수를 포함하고 있는 변환 단위, 즉 현재 파일에서만 사용 가능
- 하나의 파일 내의 모든 블록에서 접근 및 사용 가능
- 동일한 이름을 가진 자동 변수를 선언하면 더 이상 접근할 수 없음
⏳ 예제 : 내부 연결을 가지는 정적 변수
static int var; // 내부 연결을 가지는 정적 변수
void Local(void)
{
var = 20; // 정적 변수의 값 변경
cout << var << endl; //20
}
int main(void){
int var = 10; // 자동 변수 선언 - 더이상 정적 변수에 접근 X
Local();
cout << var << endl; //10
{
3) 외부 연결을 가지는 정적 변수
🌟 유효 범위를 변환 단위로 가지는 변수
- 전역 변수(global variable) 또는 외부 변수(extern variable)라고도 함
- 해당 파일 뿐만 아니라 외부 파일에서도 사용 가능
- 해당 변수를 사용하는 모든 파일에서 각각 extern 키워드를 사용하여 재선언되어야 사용가능
⛓ 파일1.cpp
#include <iostream>
using namespace std;
int var = 10; // 외부 변수 정의
...
⛓ 파일2.cpp
#include <iostream>
using namespace std;
#include "파일1.cpp"
extern int var; // 외부 변수를 사용하기 위한 재선언
...
💙 단일 정의의 원칙
여러 파일에서 외부 변수가 사용될 경우, 오직 한 개의 파일에서만 외부 변수에 대한 정의
f. 총정리
변수 종류 | 유효 범위 | 연결 | 선언 위치 | 키워드 |
자동 변수 | 블록 | 없음 | 블록 내부 | 없음 |
레지스터 변수 | 블록 | 없음 | 블록 내부 | register |
연결을 가지지 않는 정적 변수 | 블록 | 없음 | 블록 내부 | static |
내부 연결을 가지는 정적 변수 | 변환 단위 | 내부 | 함수 외부 | static |
외부 연결을 가지는 정적 변수 | 변환 단위 | 외부 | 함수 외부 | 없음 |
출처 : http://www.tcpschool.com/cpp/cpp_scope_scopeLinkage
'프로그래밍 언어 > C++' 카테고리의 다른 글
[자료형(data type)] C++ 파생형 클래스 1 : 클래스의 기본 (0) | 2023.09.13 |
---|---|
C++ 범위 : C++ 네임스페이스 (0) | 2023.09.13 |
[자료형(data type)] C++ 파생형 공용체와 열거체 총정리 (0) | 2023.09.13 |
[자료형(data type)] C++ 파생형 구조체 총정리 (0) | 2023.09.13 |
[게임 프로그래머 입문 올인원] 객체지향 : static과 싱글톤 (33강) (0) | 2023.09.12 |