유효 범위 (scope)
= 하나의 변환 단위(translation unit, 파일) 내에서 해당 변수가 사용될 수 있는 범위
- 함수 내에서 선언된 변수 : 함수 내에서만 사용 가능
- 함수 밖에서 선언된 변수 : 변수가 선언된 '이후'에 나오는 모든 함수에서 사용 가능
연결 (linkage)
= 해당 변수를 사용할 수 있는 파일의 접근 가능 여부를 나타냄
- 외부 연결을 갖는 변수 : 여러 파일에서 사용 가능
- 내부 연결을 갖는 변수 : 하나의 파일에서만 사용 가능
- 함수 내에서 선언된 변수 : 함수 밖에선 사용 불가하므로, 연결을 갖지 않음
C++ 변수의 종류
요약) 출처 : 코딩의 시작, TCP School
1. 자동 변수 (automatic variable)
- 블록(중괄호 영역) 내에서 선언된 변수를 의미 (함수의 매개변수도 자동 변수에 포함됨)
- 변수가 선언된 블록 내에서만 유효, 블록이 종료되면 메모리에서 사라짐
- 메모리 스택(stack) 영역에 저장됨
- 초기화하지 않으면 쓰레깃값으로 초기화됨
- C언어의 지역 변수와 같은 의미로 사용됨
- 변수의 이름으로 같은 이름을 여러 번 사용하는 것은 매우 잘못된 방법임
- 한 블록 내에서 같은 이름의 변수를 또다시 선언하려 하면, 컴파일러 오류 발생
2. 레지스터 변수 (register variable)
- 변수를 선언할 때, register 키워드를 붙여 선언
- CPU의 레지스터 메모리에 저장되어 빠르게 접근 가능해짐
- 컴퓨터의 레지스터는 매우 작은 크기의 메모리라서, 레지스터 영역에 변수 선언하기 어려운 경우도 많음 -> 그럴 경우, C 컴파일러는 해당 변수를 그냥 지역 변수로 선언함
- C++11 부터는, 단순히 해당 변수가 자동 변수라는 것을 의미하는 역할로만 사용되는 중
3. 정적 변수 (static variable)
- 프로그램 실행 내내 유지되는 변수
- 메모리상의 데이터 영역에 저장되며, 초기화하지 않으면 자동으로 0으로 초기화됨
정적 변수 유형
- 연결을 가지지 않는 정적 변수
- 블록 내부에서 static 키워드 사용하여 정의
- 지역 변수(해당 블록 내에서만 접근 가능)와 전역 변수(단 한번만 초기화됨, 프로그램이 종료돼야 메모리상에서 사라짐)의 특징을 모두 가짐
-
void StaticVar(void) { static int count = 1; // 연결을 가지지 않는 정적 변수 cout << count << " 번째 호출되었습니다.\n"; count++; } StaticVar(); -> 1 번째 호출되었습니다. StaticVar(); -> 2 번째 호출되었습니다. StaticVar(); -> 3 번째 호출되었습니다.
- 내부 연결을 가지는 정적 변수
- 유효 범위를 변환 단위로 갖는 변수에 static 키워드를 사용하여 정의
- 해당 변수를 포함하고 있는 변환 단위(즉, 현재 파일)에서만 사용 가능
- 하나의 파일 내의 모든 블록에서 접근/사용할 수 있음
-
static int var; // 내부 연결을 갖는 정적 변수
- 정적 변수와 같은 이름의 자동 변수가 특정 블록 내에서 선언되기 전까지, 그 블록에서는 정적 변수에 접근할 수 있음
- 외부 연결을 가지는 정적 변수
- 유효 범위를 변환 단위로 갖는 변수를 의미
- 전역 변수(global variable) 또는 외부 변수(extern variable)라고 함
- 해당 파일뿐 아니라 외부 파일에서도 사용할 수 있는 변수임 (해당 변수를 사용하는 모든 파일에서 각각 extern 키워드를 사용하여 재선언되어야 사용 가능함)
-
[파일1.cpp] int var = 10; // 외부 변수 정의 [파일2.cpp] extern int var; // 외부 변수를 사용하기 위한 재선언
- 단일 정의의 원칙 : 여러 파일에서 외부 변수가 사용될 경우, 오직 한 개의 파일에서만 외부 변수에 대한 정의를 할 수 있음
네임스페이스
- 내부 식별자에 사용될 수 있는 유효 범위를 제공하는 선언적 영역을 의미
- 일반적으로 헤더 파일에서 정의되며, 언제나 새로운 이름을 추가할 수 있도록 개방되어 있음
- C++에서는 namespace 키워드를 사용해 사용자가 새로운 네임스페이스를 정의 가능
- 전역 위치, 다른 네임스페이스 내에서도 정의될 수 있으나, 블록 내에서는 정의될 수 없음
- 기본적으로 외부 연결을 가짐
- 전역 네임스페이스 : C++의 파일 수준의 선언 영역
(일반적으로 식별자의 네임스페이스가 명시되지 않으면, 전역 네임스페이스에 자동으로 포함됨)
- C++ 표준 라이브러리 타입, 함수들은 std 네임스페이스 또는 그 속에 중첩된 네임스페이스에 선언되어 있음
네임스페이스로의 접근
범위 지정 연산자( :: )를 사용하여, 해당 이름을 특정 네임스페이스로 제한
[namespace.h]
namespace kang {
void Display();
int count;
}
namespace kim {
double display;
int count;
}
[cpp 파일]
#include "namespace.h"
...
kang::count = 4;
kim::display = 3.14;
kim::count = 100;
...
간소화된 네임스페이스로의 접근
매번 범위 지정 연산자를 사용하여 이름을 제한하는 것은 매우 불편 & 가독성이 떨어짐
-> C++의 해결책
- using 지시자 (directive)
- 명시한 네임스페이스에 속한 이름을 가져와, 범위 지정 연산자 없이도 사용할 수 있게 함
- 전역 범위에서 사용된 using 지시자 : 해당 네임스페이스의 모든 이름을 전역적으로 사용할 수 있게 함
- 블록 내에서 사용된 using 지시자 : 해당 블록에서만 해당 네임스페이스의 모든 이름을 사용할 수 있게 함
-
using namespace 네임스페이스이름;
- using 선언 (declaration)
- 단 하나의 이름만을 범위 지정 연산자 없이 사용할 수 있게 함
- using 지시자와 마찬가지로, using 선언이 나타나는 선언 영역에서만 해당 이름을 사용 가능
-
using 네임스페이스이름::이름;
참고)
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
'[공부] > C++' 카테고리의 다른 글
[C++] 기본 정리 14 - 생성자, 복사 생성자, 소멸자 (0) | 2024.02.24 |
---|---|
[C++] 기본 정리 13 - 클래스, 객체 지향 프로그래밍, this 포인터 (1) | 2024.02.24 |
[C++] 기본 정리 11 - C++ 함수(인라인 함수) (0) | 2024.02.22 |
[C++] 기본 정리 10 - C++ 함수(참조자, 디폴트 인수, 오버로딩) (0) | 2024.02.22 |
[C++] 기본 정리 9 - 함수, 재귀 호출, 함수 포인터 (0) | 2024.02.20 |