본문 바로가기
!?/C++

접근 범위, 존속 기간

by Where's my namespace 2012. 9. 14.

접근범위와 존속기간이 있다. 대부분은 이 부분을 안배웠더라도, 이해하고 사용하고 있을 것이다.

 

접근범위란, 말그래도 접근 할 수 있는 범위를 말한다. 접근 범위를 말하기에 앞서, 전역,지역 변수에 대해 먼저 말하겠다.

 

전역변수는 함수밖에 선언된 변수다. 사용법은 다음과 같다.

 

int a = 1;

int main() {

~~내용생략

}

 

위와 같은 경우 a 는 전역 변수이다. 전역 변수는 모든 곳에서 접근 가능하고 다른 파일에서도 접근 가능하다. 다른 파일

 

에서 전역 변수에 접근 하기 위해서는 파일에 extern int a; 와 같이 선언 해주면 컴파일러가 전역변수로 인지한다.

 

 

지역변수는 함수안이나, 중괄호안에 선언된 변수들을 말한다. 이 변수는 같은 영역에서만 접근 가능하다.

 

쉽게 이해하자면 일반 적으로 main 이나 함수안에 쓰는 변수는 지역변수다.

 

위의 두 종류의 변수로 접근 범위에 대한 이해가 다 됬을 것이다. 전역 변수의 경우, 접근 범위는 모든 곳에서 가능하고,

 

지역변수의 경우 접근 범위는 같은 지역에서만 접근 가능하다. 쉽게 생각하면 함수안에 선언된 변수를 생각하면

 

이해가 쉬울 것이다.

 

존속기간에 또한 접근범위와 크게 다른 개념은 아니다.

 

존속기간이란, 쉽게 생각하면 변수가 언제까지 살아있는지에 대한 것이다. 전역변수의 경우 프로그램이 시작되서 끝날 때

 

변수가 살아있어야한다. 당연한 소리다. 지역변수의 경우 그 지역만 끝나면 그 변수는 죽어버린다. 이것 또한 당연하다.

 

지역변수의 경우 그 지역을 벗어나 버리면 더 이상 사용 할 수 없으니, 죽어버리는게 당연하다.

 

이것이 존속기간이다. 쉽게 말하면, 변수의 생존기간 이라고 이해하면 된다.

 

존속 기간에서 예외적인 명령어가 있다.

 

바로 static 이다. static 의 경우 지역변수에 사용하면, 그 지역변수는 죽지 않고 프로그램이 종료될 때 까지 살아 있는다.

 

static 의 경우 다른 기능이 있는데, 초기에 한번 선언되면 그 값이 계속 유지된다. 예를 들면

 

void func() {

static int a = 0;

cout << a << endl;

a++;

}

 

과 같은 코드에서 func를 호출을 계속 하면 a 값이 계속 0으로 출력되는게 아니라, 0 , 1 ,2 ,3 순으로 출력된다. 즉 초기화

 

처음 한번만 되고, 그 값이 계속 유지되는 것이다.

 

static 은 전역 변수에도 사용 할 수 있다. 전역 변수에 static 을 사용 할 경우 다른 파일에서 그 전역변수를 사용 할 수 없

 

게 된다. 전역변수에 static 은 class 에서 protected 와 같은 기능을 한다.

 

함수에도 static 과 extern 을 사용 할 수 있는데, 함수에 static 을 할 경우 전역변수에 static 을 한 것 과 같다.

 

다른 파일에서 그 함수를 사용 할 수 없다. extern 의 경우 다른 파일에서 함수를 사용할 때 사용 하는 명령이다.

 

하지만 extern 의 경우 생략해도 컴파일러가 알아서 인지 하기 때문에 굳이 써주지 않아도 된다.

 

 

 

추가로 특이한 명령어 하나를 소개하면,

register 라는 명령어가 있다. 이 명령어는 컴퓨터는 구조적으로. 변수를 생성하면 메모리에 그 값이 저장되고, 사용

 

할 때는 레지스터로 옮기고 cpu에서 처리하는 순인데. register 라는 명령어는 변수를 메모리가 아닌 레지스터에

 

저장되게 한다. 이렇게 하면 수행속도가 다른 변수보다는 조금더 빨라진다.

 

사용 방법은,

register int a; 와 같이 일반 변수 선언 앞에 register 를 사용해 주면 된다.

 

 

 

 

'!? > C++' 카테고리의 다른 글

형변환  (0) 2012.10.12
연산자 오버로딩  (0) 2012.10.12
Exception Handling  (0) 2012.09.10
오버라이딩  (0) 2012.08.30
클래스 가상함수  (1) 2012.08.30