[C++] C++에서 범위(scope)의 의미
개념
범위(Scope)는 변수나 함수등이 프로그램에서 통용되는 부분(가시성)을 나타냅니다. 범위는 존속기간과도 밀접한 관계가 있으며, 범위에는 아래의 5가지가 있습니다.
- 지역 범위(또는 블록 범위)
- 파일 범위
- 함수 범위
- 함수 원형 범위
- 클래스 범위(C++에 새로 추가된것)
지역 범위
블록 내에서 선언된 변수는 선언된 시점 이후에 그 블록과 안쪽 블록에서 접근 가능합니다.
여기서 블록은 중 괄호( { } )로 둘러싸인 부분을 말합니다.
파일 범위
블록 밖에서 선언된 변수나 함수는 모두 이 범위 규칙을 가집니다.
이 범위 규칙을 갖는 변수나 함수는 한 파일에서 선언 이후에 아무데서나 접근 가능하며 다른 파일에서도 접근 가능한 변수나 함수는 전역 범위(global scope)를 가집니다.
전역 변수와 일반 전역 함수가 대표적인 파일 범위를 가지며, 전역 변수 중에서 특히 다른 파일에서도 접근 가능한 것을 외부 변수라고 합니다. 전역 함수는 다른 파일에서도 접근 가능합니다.
반면 전역 변수나 전역 함수 중에서 static 키워드가 붙은 정적 변수나 정적 함수는 한 파일 에서만 접근 가능합니다.
함수 범위
함수 범위도 일종의 블록 범위로 함수 블록 내에서만 통용되는 것을 의미합니다.
goto문 명칭(label)은 함수 범위의 유일한 예 이며,
이 명칭은 함수 내 어디서나 사용이 가능하지만 그 함수 바깥에서는 접근할 수 없습니다.
함수 원형 범위
함수 원형 내에 쓰인 형식 인자의 이름은 원형에서만 통용되며 중복될 수 없습니다.
함수 원형에서 쓰이는 형식 인자의 이름은 생략해도 무방합니다.
클래스 범위
클래스 범위는 클래스의 데이터 멤버 및 멤버 함수가 이 범위 규칙을 가집니다.
클래스의 멤버 함수를 정의할 때는 일반 함수와 달리 클래스 범위 연산자 :: 를 사용해야 합니다.
샘플 코드
#include <iostream>
using namespace std;
// 파일 범위
int number=1;
// 함수 원형 범위
int Function(int number);
class SampleClass {
int m_number; // 클래스 범위
public:
SampleClass() { m_number = 10; }
void Result(); // 클래스 범위
};
// 클래스 멤버 함수
void SampleClass::Result()
{
cout << m_number << ' ' << ::m_number << ' ' << f(SampleClass::m_number) << endl;
}
// 일반(전역) 함수
int Function(int number)
{
return number;
}
void main()
{
// 지역 범위(main 함수)
int _temp_num = 2;
cout << number << ' ' << _temp_num << endl;
{
// 지역 범위(안쪽 블록)
int loc_number = 3;
cout << number << ' ' << _temp_num << ' ' << loc_number << endl;
goto L;
cout << "이부분은 호출되지 않음";
}
// 함수 범위
L:
SampleClass obj;
obj.Result();
cout << Function(5) << endl;
}