컴퓨터프로그래밍 - suanlabsuanlab.com/assets/lectures/cp/12.pdf · 장 외부변수 ... 1 1...
TRANSCRIPT
변수의유효범위scope
변수의참조가유효한범위
변수의유효범위구분
지역유효범위local scope와전역유효범위global scope로나뉨
지역유효범위
함수또는블록내부에서선언되어그지역에서변수의참조가가능한범위
전역유효범위
파일에서만변수의참조가가능한범위
프로젝트를구성하는모든파일에서변수의참조가가능한범위
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 5
하나의프로젝트는여러파일로구성가능
파일main.c, 그리고파일 sub1.c와sub2.c로구성되는프로그램
파일main.c의상단에선언된global: 프로젝트전체파일에서사용될수있는전역변수
파일main.c의함수 asub()에서선언된 local: 함수내부에서만사용될수있는지역변수
파일 sub2.c의상단에선언된staticvar: 파일 sub2.c에서사용될수있는전역변수
파일sub1.c에서파일main.c의상단에선언된global을사용하려면, extern int global로선언이필요
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 6
지역변수
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 7
함수또는블록에서선언된변수 내부변수또는자동변수라고도부름
선언문장이후에함수나블록의내부에서만사용이가능 다른함수나블록에서는사용불가능
함수의매개변수도함수전체에서사용가능한지역변수
선언후초기화하지않으면쓰레기값이저장되므로주의
변수가선언된함수또는블록에서선언문장이실행되는시점에서메모리에할당
지역변수
스택stack: 지역변수가할당되는메모리영역
선언된부분에서자동으로생성되고함수나블록이종료되는순간메모리에서자동으로제거
이러한이유에서지역변수는자동변수automatic variable라부름
지역변수선언에서자료형앞에키워드auto가사용될수있음
키워드 auto는생략가능하여일반적으로auto가없는경우가대부분
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 8
Source Code #01: localvar.c
함수와 블록의 지역변수 사용
for문 블록에서 선언된 지역변수 sum for 문 블록에서만 사용이 가능
sum은 블록 외부에서 참조가 불가능
함수 sub(int param)에서와 같이 매개변수 param 지역변수와 같이 사용
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 9
전역변수global variable
함수외부에서선언되는변수
외부변수라고도부름
일반적으로프로젝트의모든함수나블록에서참조가능
선언되면자동으로초기값이자료형에맞는 0으로지정 즉정수형은0, 문자형은null 문자인‘\0’, 실수형은0.0, 포인터형은NULL 값이저장
함수나블록에서전역변수와같은이름으로지역변수를선언가능
함수내부나블록에서그이름을참조하면지역변수로인식
그러므로지역변수와동일한이름의전역변수는참조불가능
가능한이러한변수는사용하지않도록해야함
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 10
전역변수global variable
전역변수는동일프로젝트의다른파일에서도참조가가능
다른파일에서선언된전역변수를참조하려면키워드 extern을사용하여이미다른파일에서선언된전역변수임을선언
extern을사용한참조선언구문 변수선언문장맨앞에 extern을넣는구조, extern 참조선언구문에서자료형은생략가능
키워드extern을사용한변수선언은새로운변수를선언하는것이아니며, 단지이미존재하는전역변수의유효범위를확장
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 11
한프로젝트에여러소스파일로구성
다음프로젝트는파일globalvar.c와circumference.c로구성된예제
함수getArea()와getCircum()에서파일globalvar.c에서선언된전역변수PI를사용
함수getCircum()이구현된파일은circumference.c
전역변수PI가선언된파일과다름
파일 circumference.c에서전역변수PI를사용하려면문장 extern double PI;
외부에서이미선언된변수임을알리는선언을다시해주어야함
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 12
Source Code #02: globalvar.c
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 13
함수main()에서전역변수와같은이름의지역변수PI를선언
전역변수와동일한이름의지역변수선언은더이상함수main()에서전역변수PI를다시참조할수없게만듬
전역변수gi는선언후초기값을저장하지않아도자동으로기본값default value인 0이저장
외부변수의사용
다른파일의전역변수PI 사용
extern으로선언후사용
전역변수장단점
전역변수의선언위치가변수를참조하려는위치보다뒤에있는경우 전역변수를사용하기위해서는extern을사용한참조선언이필요
동일한파일에서도extern을사용해야하는경우가발생가능
소스파일중간이나하단에전역변수를배치하는방법은바람직하지않음
장단점 전역변수는어디에서든지수정할수있으므로사용이편한장점
전역변수에예상하지못한값이저장
프로그램어느부분에서수정되었는지알기어려운단점
이러한문제로전역변수는가능한제한적으로사용하는것이바람직
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 15
정적변수의초기화
반드시상수로만가능 왼쪽소스에서정적변수의초기값에변수를대입
초기화문법오류가발생
오른쪽과같이상수를대입
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 16
Lab #01: 피보나치수의출력
피보나츠의수는 1, 1로시작하여이전두수를더한수
즉5개의피보나츠수는1, 1, 2, 3, 5
표준입력으로받은3 이상의정수를전역변수count에저장한후
재귀함수인 fibonacci()에서count-1 개의피보나츠의수를출력
함수 fibonacci()의매개변수는 (int prev_number, int number)으로이전두정수가인자, 자기자신을호출하는재귀함수
함수 fibonacci()에서자기자신이호출된수를저장하는정적지역변수 i를사용하며초기값은1로지정
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 17
결과 피보나츠를몇개구할까요?(3 이상) >> 20
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
기억부류
변수선언의위치에따라변수: 전역과지역
변수 4가지기억부류storage class
auto, register, static, extern
할당되는메모리영역이결정되고메모리의할당과제거시기가결정
기억부류는키워드auto, register, static, extern에의해구분
자동변수인auto는일반지역변수로생략가능
전역변수또는지역변수
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 20
기억부류
auto와 register 지역변수에만이용이가능
static 지역과전역모든변수에이용가능
extern 전역변수에만사용이가능
컴파일러에게변수가이미어딘가 (주로다른파일)에존재하고이제사용하겠다는것을알리는구문에사용되는키워드
extern이선언되는위치에따라이변수의사용의범위는전역또는지역으로한정
기억부류 auto, register, static 새로운변수의선언에사용되는키워드
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 21
기억부류사용구문
변수선언문장에서자료형앞에하나의키워드를넣는방식
키워드 extern을제외하고나머지 3개의기억부류의변수선언에서초기값을저장가능
이미지역변수에서다룬것처럼키워드 auto는지역변수선언에사용되며생략가능.
함수에선언된모든변수가 auto가생략된자동변수
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 23
키워드 register
변수를연산에참여시키려면다시CPU 내부에레지스터에불러들여연산을수행
레지스터변수
변수의저장공간이일반메모리가아니라CPU 내부의레지스터(register)에할당되는변수
키워드 register를자료형앞에넣어선언
지역변수에만이용이가능
지역변수로서함수나블록이시작되면서CPU의내부레지스터에값이저장
함수나블록을빠져나오면서소멸되는특성
CPU내부에있는기억장소이므로일반메모리보다빠르게참조가능
일반메모리에할당되는변수가아니므로주소연산자&를사용불가능
주소연산자&를사용하면문법오류가발생
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 25
레지스터변수
시스템의레지스터는그수가한정
레지스터변수로선언하더라도레지스터가모자라면일반지역변수로할당
주로레지스터변수는처리속도를증가시키려는변수에이용
특히반복문의횟수를제어하는제어변수에이용하면효과적
레지스터변수도일반지역변수와같이초기값이저장되지않으면쓰레기값이저장
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 27
키워드 static
정적변수static variable를선언
변수선언에서자료형앞에키워드 static 기술
종류 정적지역변수static global variable와정적전역변수static local variable로구분
특성 초기생성된이후메모리에서제거되지않으므로지속적으로저장값을유지하거나수정가능한특성
프로그램이시작되면메모리에할당되고, 프로그램이종료되면메모리에서제거
초기값을지정하지않으면자동으로자료형에따라0이나‘\0’ 또는NULL 값이저장
초기화는단한번만수행
한번초기화된정적변수는프로그램실행중간에더이상초기화되지않는특성
주의할점은초기화는상수로만가능
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 28
Source Code #04: staticlocal.c
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 30
정적지역변수인 sindex 함수가종료되어도메모리에계속변수값이남아있어함수 increment()가호출될때마다그값이1씩증가
지역변수 aindex 함수 increment()가호출될때마다다시새롭게메모리에할당되고, 함수가종료되면메모리에서제거되어, aindex는항상1이출력
정적지역변수
정적지역변수 함수나블록에서정적으로선언되는변수
유효범위는선언된블록내부에서만참조가능: 지역변수특성
함수나블록을종료해도메모리에서제거되지않고계속메모리에유지관리되는특성: 전역변수특성
함수에서이전에호출되어저장된값을유지하여이번호출에사용가능
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 31
Source Code #05: staticgvar.c, gfunc.c
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 32
정적 전역변수 svar의 사용
정적 전역변수인 svar 사용 불가능다른 파일
전역변수인 gvar 사용 가능
정적전역변수
함수외부에서정적으로선언되는변수 정적전역변수는선언된파일내부에서만참조가가능한변수
정적전역변수는extern에의해다른파일에서참조가불가능
일반전역변수 파일소스가다르더라도extern을사용하여참조가가능
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 33
부작용side effect
전역변수의사용은모든함수에서공유할수있는저장공간을이용할수있는장점
어느한함수에서잘못다루면모든함수에영향을미치는단점
특히프로그램이크고복잡하면전역변수의사용은원하지않는전역변수의수정과같은부작용side effect의위험성이항상존재
그러므로가급적이면전역변수의사용을자제하는것이좋으며,
부득이전역변수를이용하는경우에는파일에서만전역변수로이용할수있는정적전역변수를이용하는것이바람직
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 34
Lab #02: 지역변수와정적변수의사용
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 35
함수main()에서함수process()를세번호출
함수process()에는지역변수와정적지역변수가선언
간단한연산과함께출력
다음소스를보고출력결과를예상
함수process()의지역변수 x, 정적지역변수 sx
메모리영역
데이터, 스택, 힙영역 메모리영역은변수의유효범위scope와생존기간life time에결정적역할
변수는기억부류storage class에따라할당되는메모리공간이달라짐 기억부류는변수의유효범위scope와생존기간life time을결정
기억부류는변수의저장공간의위치가데이터data영역, 힙heap 영역, 스택stack 영역인지도결정하며, 초기값도결정
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 37
메모리영역
데이터영역 전역변수와정적변수가할당되는저장공간
메모리주소가낮은값에서높은값으로저장장소가할당
프로그램이시작되는시점에정해진크기대로고정된메모리영역이확보
힙영역
동적할당dynamic allocation되는변수가할당되는저장공간
데이터영역과스택영역사이에위치
스택영역 함수호출에의한형식매개변수그리고함수내부의지역변수가할당되는저장공간
힙영역과스택영역은프로그램이실행되면서영역크기가계속적으로변함
메모리주소가높은값에서낮은값으로저장장소가할당
함수호출과종료에따라메모리가할당되었다가다시제거되는작업이반복
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 39
변수이용기준
전역변수의사용을자제하고지역변수를주로이용
레지스터변수
실행속도를개선하고자하는경우
정적지역변수
함수나블록내부에서함수나블록이종료되더라도계속적으로값을저장
정적전역변수
해당파일내부에서만변수를공유하고자하는경우
전역변수
프로그램의모든영역에서값을공유하고자하는경우
가능하면전역변수의사용을줄이는것이프로그램의이해를높일수있으며발생할수있는프로그램문제를줄일수있음
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 41
변수이용기준
전역변수와지역변수를정리 변수할당메모리영역에따라변수의할당과제거의시기가결정
데이터영역의전역변수와정적변수
프로그램시작시메모리가할당되고, 프로그램종료시메모리에서제거
스택영역과레지스터에할당되는자동지역변수와레지스터변수
함수또는블록시작시메모리가할당되고, 함수또는블록종료시메모리에서제거
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 42
변수의초기값
변수의종류에따라초기값 초기값저장문장의실행시점
초기값이명시적으로지정되지않을경우자동으로지정되는기본초기값
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 45
전역변수와지역변수
전역변수global, sglobal
지역변수 fa, fs의선언과사용을알아보는프로그램
sglobal은정적전역변수이므로외부파일에서는참조할수없으며
정적지역변수인 fs는함수가종료되더라도그전에저장된값이계속유지
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 47
Lab #03: 은행계좌의입출금구현
• 컴퓨터프로그래밍(Computer Programming) - 12 변수유효범위 48
은행계좌의입출금을구현 전역변수 total
두함수 save()와withdraw() 구현
정적지역변수amount를사용
몇개의입출금에대해출력
전역변수 total에는초기금액과계좌잔고가저장
함수 save()와withdraw()는각각매개변수금액의입출금을구현
정적지역변수amount를사용하여총입금액과총출금액을관리하여출력