티스토리 뷰


정적변수(static)


: 정적으로 할당되는 변수이다.

 

정적변수의 특징


- 지역 변수와 전역 변수의 성질을 같이 가지고 있다.

- 지역 변수처럼 선언 된 함수 안에서만 사용이 가능하다.

- 전역 변수처럼 프로그램이 종료 될 때까지 메모리 공간에 존재하게 된다.

- 지역 변수와는 달리 해당 함수가 반환을 하더라도 소멸되지 않는다.


C 및 관련 언어에서는 정적 변수와 기타 개념들 모두 static 키워드가 사용된다.

 

정적 변수 예제


#include < stdio.h >


  void increase()


{


  int num1 = 0; // 변수 선언 및 값 초기화


  printf("%d\n", num1); // 변수 num1의 값을 출력


  num1++; // 변수의 값을 1씩 증가


}


int main()


{


 

  increase(); // 0


 

  increase(); // 0


 

  increase(); // 0


 

  increase(); // 0: 변수가 매번 생성되고 사라지므로 0 출력


 

  return 0;


}

 

함수가 끝나면 num1의 값은 사라지기 때문에 실행 결과는 0 0 0 0이 된다.

하지만 정적 변수 static을 선언해주면

 

#

include < stdio.h >


  void increase()


{


  static int num1 = 0; // 정적 변수 선언 및 값 초기화


  printf("%d\n", num1); // 정적 변수 num1의 값을 출력


  num1++; // 정적 변수 num1의 값을 1 증가시킴


}


int main()


{


  increase(); // 0


  increase(); // 1


  increase(); // 2


  increase(); // 3: 정적 변수가 사라지지 않고 유지되므로 값이 계속 증가함


  return 0;


}

 

이와 같이 함수가 종료되어도 메모리에 값이 저장 되어 실행결과가 1씩 증가되는 모습을 볼 수 있다.

 


외부변수(extern)


: 여러 개의 함수들이 하나의 데이터를 공유할 때 함수 바깥에 선언되었다면 어느곳에서라도 사용 가능한 전역 변수이다.

 

외부변수의 특징


- 함수 바깥 뿐 아니라 소스 A.c B.c 등 소스에서 소스로 변수 데이터를 사용할 수 있다.

- 외부 변수는 선언되는 순간 메모리의 특정 영역에 저장되어 프로그램이 실행되는 동안 계속 해서 존재한다.

- 외부변수는 선언되는 순간 0으로 자동적으로 초기화 된다.

- 외부 변수는 주로 파일 간에 변수를 공유할 목적으로 이용된다.

 

외부 변수 예제

#

include < stdio.h >


  int result;


void ex()


{


  result = 5;


}


int main()


{


  result = 10;


  printf(“메인 함수 result 값: % d\ n”, result); // 결과 10


  ex();


  printf(“ex 함수 result 값: % d\ n”, result); // 결과 5


}


이렇게 함수 밖에 선언되었기 때문에 저 변수는 어떠한 함수에서든 사용이 가능하다.

 

레지스터변수(register)


: register 키워드를 변수 앞에 선언하고 실행하면 그 변수는 cpu에 접근이 가장 빠른 메 모리 공간에 저장이 된다.

 

레지스터변수의 특징


- register 키워드 사용은 항상 작동되지 않고 cpu의 판단에 의해 무시 될 수도 있다.

- register 키워드를 사용하면 사용하지 않은 것 보다 더 빠르게 처리가 된다.

- register 키워드가 필요한 부분에 컴파일러가 알아서 붙여준다.

- 컴퓨터의 사양 또는 메모리 용량 등에 따라 다르게 나타난다.

         실수는 레지스터형 변수가 될 수 없다.

- 세 개 이상의 레지스터형 변수를 선언하면 최초 두 개 까지만 레지스터형이 되고 나머지는 지역변수가 된다.

 

register int a; // 레지스터형 변수 a선언

register double d; // 실수는 레지스터형 변수가 될 수 없음. 지역변수로 선언된다.

register a,b,c; // a,b만 레지스터형 변수가 되고 c는 지역변수가 된다.

 

레지스터형 변수를 사용하는 이유는 조금이라도 더 빠른 속도를 얻기 위해서이다. 대규모의 루프를 돌린다거나 할 때 루프 제어 변수를 레지스터형으로 선언하면 이 변수의 읽기 속도가 빨라지므로 전체 루프의 실행 속도가 빨라질 것이다.

register int i, j;

for (i=0;i<10000000;i++) {

for (j=0;j<1000;j++)


 

 

 

Comments