230 likes | 498 Views
Chapter9. 변수영역. 지역변수와 전역변수 정적변수 레지스터변수. 변수의 종류와 영향범위에 따른 활용방법을 알아본다 . 변수의 종류에 따라 처리되는 우선순위를 알아본다. 1.1 지역변수. 지역변수 (Local Variable) : 실행되는 단위 블록 내에서만 유효함 . 선언된 블록의 영역을 넘어가면 효력이 없음 지역변수가 선언된 블록이 실행될 때 메모리에 할당되고 블록이 종료되면 메모리에서 자동으로 해제된다. 두 함수에서 사용하는 지역변수 a 는 , 변수명은 서로 같으나
E N D
지역변수와 전역변수 정적변수 레지스터변수
변수의 종류와 영향범위에 따른 활용방법을 알아본다. 변수의 종류에 따라 처리되는 우선순위를 알아본다
1.1 지역변수 • 지역변수(Local Variable) : • 실행되는 단위 블록 내에서만 유효함. • 선언된 블록의 영역을 넘어가면 효력이 없음 • 지역변수가 선언된 블록이 실행될 때 메모리에 할당되고 블록이 종료되면 메모리에서 자동으로 해제된다 두 함수에서 사용하는 지역변수 a는, 변수명은 서로 같으나 별개의 변수
1.1 지역변수 • 자동변수 • 초깃값을 지정하지 않으면, 시스템에서 자동으로 임의의 값을 할당하는 변수 • auto를 변수 a 앞에 붙이면 a는 자동 지역변수가 됨 • 키워드 auto : 자료형 앞에 붙일 수 있는 변수의 기억 클래스로, 자동변수라는 의미
1.2 전역변수 • 전역변수(Global Variable) • 모든 블록에서 사용할 수 있으며, 다른 파일에서도 사용할 수 있는 변수 • 변수 gVal이 전역변수라는 것을 변수명만 보더라도 알 수 있게 하려고,변수명에접두어g를 사용 그래서 주의!
1.2 전역변수 • 키워드 extern • 한 파일에서 전역변수로 선언된 변수를 다른 파일에서 사용하기 위해 씀 • 사용하려는 변수가 다른 곳에서 전역변수로 사용하고 있다고 알려줌 • extern 사용법
1.2 전역변수 • 예제 9-1) 지역변수와 전역변수 예제 // main.c파일 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 #include <stdio.h> #include "myheader.h“ intgVal = 1; int main(void) { int value = 10; printf("지역변수 value 값은 %d이다.\n", value); printf("전역변수 gVal값은 %d이다.\n", gVal); A( ); printf("함수 A( ) 실행 후\n"); printf("지역변수 value 값은 %d이다.\n", value); printf("전역변수 gVal값은 %d다.\n", gVal); return 0; }
1.2 전역변수 • 예제 9-1) 지역변수와 전역변수 예제 // myheader.h 01 void A( ); • // func.c 01 02 03 04 05 06 07 #include "myheader.h“ extern intgVal; void A( ) { int value = 20; gVal++; }
1.2 전역변수 • 혼자해보기9-1) 다음 소스코드에서 틀린 부분을 수정하시오. 그리고 출력 결과를 예측하시오. // main.c파일 01 02 03 04 05 06 07 08 09 10 11 12 13 14 #include <stdio.h> #include "myheader.h“ intgNumber = 20; int main(void) { int a = 10; int result; printf("전역변수 gNumber값은 %d이다.\n", gNumber); result = Sum(a); printf("함수 Sum( ) 실행 결과값은 %d이다\n", result); printf("전역변수 gNum값은 %d이다.\n", gNumberl); return 0; }
1.2 전역변수 • 혼자해보기9-1) 다음 소스코드에서 틀린 부분을 수정하시오. 그리고 출력 결과를 예측하시오. // myheader.h 01 int Sum(int a); • // func.c #include "myheader.h“ int Sum(int a) { gNumber += a; return gNumber; } 01 02 03 04 05 06 07
1.3 변수의 우선순위 • 변수의 우선순위를 살펴봐야 하는 이유 • 전역변수와 지역변수가 동일한 이름으로 선언될 수 있음 • 다른 블록에서도 같은 이름의 지역변수를 만들 수 있음 • 변수의 우선 순위 원칙 ① 지역변수 > 전역변수 ② 같은 지역변수라면, 하위 블록에서 선언한 지역변수 > 상위 블록에서 선언한 지역변수
1.3 변수의 우선순위 • 변수 number로 알아보는 우선순위
1.3 변수의 우선순위 • 변수 number로 알아보는 변수의 유효영역과 생명력
1.3 변수의 우선순위 • 예제 9-2) 변수의 유효영역 예제 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 #include <stdio.h> void A(); int Number = 1; int main(void) { int Number = 10; printf("지역변수 Number 값은 %d이다.\n", Number); { int Number ; Number = 20; printf("블록 안의 지역변수 Number 값은 %d이다.\n", Number); }
1.3 변수의 우선순위 • 예제 9-2) 변수의 유효영역 예제 16 17 18 19 20 21 22 23 24 25 26 printf("내부 블록 밖의 Number 값은 %d이다.\n", Number); A(); return 0; } void A() { Number++; printf("전역변수 Number 값은 %d다.\n", Number); }
2.1 정적변수란 • 정적변수(Static Variable) • 프로그램의 실행이 끝날 때까지 메모리에 계속 보존되는 변수 • 전역변수와 생명력이 동일 • 변수가 사용될 수 있는 유효영역은 선언되는 위치에 따라 다름
2.1 정적변수란 • 정적변수 선언 • 정적변수의초깃값 • 처음에 할당하지 않으면 임의의 값이 할당되지 않음 • 컴파일할 때에 한 번만 부여됨
2.2 내부 정적변수 • 내부 정적변수: 함수의 내부에서 선언한 정적 지역변수 • 즉, 함수 내부에서 선언해 사용함 • 변수값이 소멸되지 않고 계속 보존되기 때문에 지역변수 영역에서 쓰면서 프로그램이 종료될 때까지 값을 보존하고 싶을 경우에 사용 • 예) 함수의 호출 횟수를 알고 싶을 때
2.2 내부 정적변수 • 예제 9-3) 함수의 호출 횟수를 기록하는 예제 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 #include <stdio.h> void CallNumber(); int main(void) { inti; for(i = 0; i < 5; i++) CallNumber(); return 0; } void CallNumber() { static int count = 1; int number = 1; printf("%d번째 호출되었습니다. \n", count++); printf("Number 값은 %d이다. \n\n", number++); }
3. 레지스터 변수 • 레지스터 변수(Register Variable) : • 연산 속도를 향상히키려고 CPU 내에 있는일반 레지스터를 기억장소로 사용 • 레지스터 변수의 선언 방법 • 레지스터 변수의 특징 • 레지스터 변수의 자료형은int, char, short 및 포인터형만 사용 • CPU의 레지스터에 저장되므로 처리속도가 일반변수보다 빠름 • 반복문의 반복 횟수를 결정하는 변수(첨자)에 주로 사용
3. 레지스터 변수 • 예제 9-4) 레지스터 변수를 사용하는 예제 01 02 03 04 05 06 07 08 09 10 11 12 13 #include <stdio.h> int main(void) { register int count = 1; int result = 0; for(count = 1; count <= 5; count++) result += count; printf("1부터 5까지 합은 %d다.\n", result); return 0; }