하나의 프로그램 안에서 하나 이상의 함수를 사용할 때 발생하는 문제를 다룬다. 

10.1 : local variables

10.2 : external variables

10.3 : blocks (compound statements containing declarations)

10.4 : c의 'scope - 범위 or 변수 범위'. local, external, blocks안에서 선언된 name의 규칙

10.5 : 함수 프로토타입, 함수 정의, 변수선언 등에 대한 방법


10.1 Local Variables


함수의 body 안에서 선언된 변수를 그 함수에 local하다, local variable이다라고 한다.


int sum_digits(int n)    {

int sum = 0;    /* local variable */

while (n > 0) {

sum += n % 10;

n /= 10;

}

return sum;

}


properties of local variables


automatic storage duration: storage duration (or extent)은 프로그램 내에서 변수를 위한 storage(저장공간?)가 존재하는 부분을 말한다. local variable의 storage는 그 변수가 속한 함수가 호출될 때 '자동적으로' allocate(할당)되고, 함수가 return할 때 deallocate(해제?)된다. local variable은 속한 함수가 값을 리턴했을 때 값을 유지하지 않는다. 따라서 함수가 다시 호출되었을 때, 예전 값을 유지한다는 보장이 없다.


block scope: 변수의 scope(범위)는 프로그램 중에서 그 변수가 참조될 수 있는 부분이다. local variable은 'block scope'를 갖는다. 그 변수의 선언부터, 속한 함수 body의 끝 부분까지. local variable의 범위가 속한 함수를 넘지 못하기 때문에, 다른 함수에서는 같은 이름의 변수를 다른 목적으로 사용할 수 있다.

(C99) C99에서는 변수의 선언이 반드시 함수의 맨 처음에 오지 않아도 되기 때문에, local variable의 범위를 아주 작게 할 수도 있다.


Static Local Variables


로컬 변수 선언시에 'static'을 추가하면, 그 변수는 automatic storage duration이 아닌 static storage duration을 갖는다. 이제 이 변수의 storage는 함수가 끝날 때 같이 끝나지 않고 프로그램이 끝날 때까지 유지된다. 그러나, 여전히 block scope를 가지며 다른 함수에서 visible하지 않다.


void f(void)    {

static int i;    /* static local variable */

...

}


Parameters


파라미터도 local variable과 같은 특성을 가진다(automatic storage duration, block scope). 

파라미터와 local variable의 유일한 실질적인 차이점은 파라미터는 함수가 호출될 때 자동적으로 initialize된다는 것.



10.2 External Variables


함수와의 정보 전달은 passing argument를 통해서도 가능하지만, exeternal variable을 통해서도 가능하다.

external variable(또는, global variable)은 함수 몸체 바깥에서 선언된 변수이다.


properties of external variables


static storage duration: static으로 선언된 local variable과 같다. 한번 변수에 저장된 값은 계속 저장되어 있다.

file scope: 변수가 선언된 시점부터 프로그램이 끝날 때까지 visible하다. 따라서 선언 이후에 나오는 모든 함수에서 접근하고 값을 수정할 수 있다.


using external variables to implement a stack(fragment)


Pros and Cons of External Variables

다수의 함수가 하나의 변수를 공유하거나, 몇개의 함수가 다수의 변수를 공유할 때 external variable을 사용하면 편리하다.

그러나 대부분의 경우에는 parameter를 통한 전달이 변수를 공유하는 것보다 낫다. 그 이유는

- 프로그램을 관리하면서 external variable을 수정할 때(type 등) 그것이 각각의 함수에 대해 어떤 영향을 미치는지 일일이 체크해야 한다.

- external variable에 잘못된 값이 할당되었을 때, 어떤 함수가 잘못되었는지 찾기 힘들다.

- external variable에 의존하는 함수는 다른 프로그램에서 재사용하기가 힘들다. (not self-contained)

  재사용을 위해 그 함수가 필요로 하는 모든 external variable까지 같이 가져가야 한다.


external variable을 남용하는 프로그래머들이 많다.

external variable을 사용할 때는, 의미있는 이름을 사용해야 한다.


숫자 맞추기 게임(external variable을 사용)


숫자 맞추기(external variable 사용하지 않고. 바뀐 부분은 볼드체)



10.3 Blocks


앞서 5.2에서 여러개의 statement를 묶어 { statements } 로 만든 것을 다뤘다. (selection statement에서)

이제부터 여러개의 statement를 중괄호로 묶은 것을 block이라고 표현한다.

block 안에 변수의 선언도 들어갈 수 있는데, 그렇게 선언된 변수들은 automatic storage duration, block scope이다.

블럭 안에서 변수를 선언하는것의 장점 - 아주 잠깐 사용할 변수들을 함수 앞부분에 정의해 어수선하게 만들지 않아도 된다. name conflict를 줄인다.

(C99) 함수와 마찬가지로, 블럭 안 어디서나 변수를 선언할 수 있다.


10.4 Scope


범위에 대한 규칙

블럭 내에서 선언된 변수의 이름이 이미 visible한(file scope이거나, 소속한 블럭에서 이미 선언되었거나) identifier(식별자: https://msdn.microsoft.com/ko-kr/library/e7f8y25b.aspx)경우, 새로운 선언은 예전 것을 'hide'하고, 식별자는 새로운 의미를 갖는다. 그 블럭이 끝나면, 그 식별자는 다시 예전 의미를 다시 얻는다.


10.5 Organizing a C Program


여기서는 하나의 파일 안에서 이뤄지는 프로그램을 다룸. 여러개의 파일을 사용하는 프로그램은 15장에서 다룸.


프로그램 순서 예시:

#include directives

#define directives

Type definitions

Declarations of external variables

Prototypes for functions other than main

Definition of main

Definitions of other functions


포커 점수 계산






+ Recent posts