스코프의 개념
쉽게 말해서 블록 바깥에서 어떠한 대상을 볼 수 있냐의 개념이라고 생각하면 된다.
스코프는 블록{}으로 구분할 수 있다.
스코프 활용의 예시를 살펴보자. 아래는 하위 스코프에서 상위 스코프의 변수를 사용하는 예시다.
using namespace std;
int main()
{
int apple = 5;
cout << apple << endl;
{
apple = 1;
cout << apple << endl;
}
cout << apple << endl;
}
위의 에시에서 apple은 정상적으로 1로 출력된다.
하지만 만약 블록 안에서 별도의 apple이란 변수를 선언하면어떻게 될까?
int apple = 5;
cout << apple << endl;
{
int apple = 1;
cout << apple << endl;
}
cout << apple << endl;
위 코드를 실행해보면 다음과 같이 출력된다.

마지막에서 출력하는 apple은 스코프 밖에서 선언한 apple 변수다.
1로 선언한 apple 변수는 스코프 안에서만 적용되기 때문에 스코프 밖에서는 접근할 수 없다.
당연히 위와 같은 방식의 코딩은 햇갈리기 때문에 변수 이름 자체를 다르게 가져가는게 바람직하다.
namespace using scope
namespace를 using할때 모호함으로 인한 오류를 피하기 위해서도 스코프를 사용할 수 있다. 서로 다른 namespace 안에 동일한 이름의 요소가 존재해서 모호성이 발생한다면 특정 스코프에서만 using namespace를 선언하면 해당 스코프 안에서만 유효하기 때문에 오류가 발생하지 않는다.
namespace a
{
int my_var(10);
}
namespace b
{
int my_var(20);
}
int main()
{
// scope를 통한 namespace 구분
{
using namespace a;
std::cout << my_var << std::endl;
}
{
using namespace b;
std::cout << my_var << std::endl;
}
}
두 번째 scope에서는 using namespace a가 유효한 범위가 아니기 때문에 namespace b의 my_var만 인식이 가능해서 모호함이 발생하지 않는다.
전역변수
스코프 안에서 전역변수에 접근하기 위해서는 namespace 없이 :: 연산자를 사용해서 접근한다.
아래 코드에서 지역변수로 value를 선언했기 때문에 전역변수 value가 shadowing 되어 사라진다. 전역변수에 접근하기 위해서는 :: 연산자를 사용하면 된다.
using namespace std;
int value = 123;
int main()
{
cout << value << endl;
int value = 1;
cout << value << endl;
cout << ::value << endl; // 전역 변수 접근
}

'C++ 학습' 카테고리의 다른 글
| [C++] internal linkage, external linkage (0) | 2023.10.14 |
|---|---|
| [C++] 정적 변수 (0) | 2023.10.03 |
| [C++] 연산자 (0) | 2023.10.01 |
| [C++] 심볼릭 상수 (0) | 2023.09.28 |
| [C++] 캐스팅 (0) | 2023.09.28 |