brunch

You can make anything
by writing

C.S.Lewis

by 가필드의 인사이트 Oct 02. 2018

C++ 프로그램의 구조:: 범위(Scope)

Standard C++ 정복

범위(scope)는 심볼(symbol)이 프로그램에서 통용되는 부분, 즉 가시성을 나타낸다. 범위는 심볼의 존속기간(lifetime)과도 밀접한 관계가 있다. 범위에는 지역 범위, 파일 범위, 함수 범위, 함수 원형 범위, 클래스 범위의 다섯 가지 종류가 있다. 이 중에서 클래스 범위는 (C에 비해) C++에 새로 추가된 것이다. 


지역 범위

블록 내에서 선언된 심볼은 선언된 시점 이후에 그 블록과 안쪽 블록에서 접근 가능하다. 블록은 중 괄호({})로 둘러싸인 부분을 말한다. 지역 범위를 블록 범위(block scope)라고도 한다. 


파일 범위

블록 밖에서 선언된 심볼은 모두 이 범위 규칙을 가진다. 이 범위 규칙을 갖는 심볼은 한 파일에서 선언 이후에 아무데서나 접근 가능하며 다른 파일에서도 접근 가능한 심볼은 전역 범위(global scope) 를 갖는다고 한다. 전역 변수와 일반 전역 함수가 대표적인 파일 범위를 가진다. 전역 변수 중에서 특히 다른 파일에서도 접근 가능한 것을 외부 변수라고 한다. 전역 함수는 다른 파일에서도 접근 가 능하다. 반면 전역 변수나 전역 함수 중에서 static 키워드가 붙은 정적 변수나 정적 함수는 한 파일 에서만 접근 가능하다. 


함수 범위 

함수 범위도 일종의 블록 범위로 함수 블록 내에서만 통용되는 것을 의미한다. goto문 명칭(label)은 함수 범위의 유일한 예이다. 이 명칭은 함수 내 어디서나 사용이 가능하지만 그 함수 바깥에서는 접 근할 수 없다. 


함수 원형 범위

함수 원형 내에 쓰인 형식 인자의 이름은 원형에서만 통용되며 중복될 수 없다. 함수 원형에서 쓰이 는 형식 인자의 이름은 생략해도 무방하다. 


클래스 범위

클래스 범위는 클래스의 데이터 멤버 및 멤버 함수가 이 범위 규칙을 가진다. 클래스의 멤버 함수를 정의할 때는 일반 함수와 달리 클래스 범위 연산자 :: 를 사용해야 한다.


[프로그램1] scope.cpp를 통해 범위 규칙을 알아보자. 

출력 결과


1 2 

1 2 3 

10 1 10 

5


정수형 변수 a는 지역 범위, 파일 범위, 클래스 범위, 함 수 원형 범위로 쓰이고 있고 goto문의 명칭 L은 함수 범위로 쓰이고 있다.


6행의 a는 파일 범위를 가지는 전역 변수이다. 이 변수는 임의 블록에서 사용 가능하다. 클래스 C의 멤버 함수에서도 쓰였고, main() 함수 블록 및 그 안쪽 블록에서도 쓰이고 있다. 이 전역 변수의 이름 과 동일한 것이 여러 곳에서 쓰이고 있지만 범위가 각각 다르다. 함수 f()도 파일 범위를 갖는다. 이 런 일반 함수는 기본적으로 전역 함수이다. 따라서 전역 변수 a와 마찬가지로 프로그램 내 임의의 블록에서 사용할 수 있다.(19행 및 42행) 


8행은 함수 원형 범위를 설명해 주는 것으로 f()의 함수 원형의 형식 인자로 쓰인 변수 a는 이 원형 에서만 유효하다. 즉 전역 변수 a나 클래스 범위 변수 a(11행)와는 관련이 없다. 심지어 함수 f()를 정 의하는 부분(22행)에서는 형식 인자 이름을 a가 아닌 n으로 주었다(함수 원형에서 형식 인자의 이름 은 의미가 없다). 


클래스 C의 데이터 멤버 a와 멤버 함수 g()는 클래스 범위를 가진다. 멤버 함수 g()를 클래스 바깥에 서 정의할 때는 클래스 범위를 지정하는 연산자 ::를 사용한다(17행). 19행은 같은 이름을 갖는 변수 에 대한 해결이 필요한 예를 보이고 있다. 전역 변수로서의 a는 임의의 블록에서 사용될 있지만 블록 내에 그 이름으로 선언된 변수가 있으면 그 변수가 우선순위를 가진다. 따라서 a는 클래스 블록 의 a, 즉 클래스 멤버를 지칭한다. 전역 변수를 지칭하려면 단항 연산자로서의 전역 범위 연산자(::)를 변수 앞에 붙여야 한다. 클래스 멤버를 나타내는 확실한 방법은 역시 클래스 범위 연산자를 사용하는 것이다. 


지역 범위를 갖는 변수는 29행과 33행에 있다. 변수 b는 main() 함수 블록에서 사용이 가능하다. 물 론 안쪽 블록에서도 가능하다. 그러나 변수 c는 자신이 선언된 블록에서만 유효하다. 지역 범위를 갖 는 변수가 또 하나 있다. 함수 f()를 정의하는 22행에서 형식 인자 n이 그것이다. 함수 f()를 다음과 같이 옛 C 언어 방식으로 정의하면 n이 함수 블록에서만 유효하다는 것을 직관적으로 알 수 있을 것 이다. 


마지막으로 함수 범위에 해당하는 변수는 39행에 있다. goto문의 명칭 L은 main() 함수에서만 의미가 있다.



작가의 이전글 건강하면 보험료를 깍아준다?
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari