함수안에 선언된 변수는 그 함수를 빠져 나가면 사라진다. 할당되었던 메모리는 해제되고 저장되어 있던 값도 사라진다. 이러한 특성 때문에 자동변수(auto variable) 이라고 부르기도 한다. 그 함수 내에서만 유효하다고 해서 지역변수라고 부르기도 한다. 따라서 그 함수로 들어올 때 마다 변수가 다시 메모리 할당된다.
그래서 함수간 또는 파일간에 변수 값을 공유하고자 할 때는 전역변수(global variable) 또는 정적변수(static variable)를 사용하는데 이 두 변수간의 차이를 정확히 이해를 하고 사용해야 한다.
전역변수와 정적변수는 lifetime은 동일하다. 즉, 해당 프로그램이 죽을 때까지 한번 할당된 변수 메모리와 값은 유지된다는 점이다. 반면에 scope는 서로 다르다. 전역변수는 해당 프로그램(실행파일 기준)의 어느 함수, 어느 파일에서도 접근이 가능한 반면 정적변수는 변수가 선언된 파일이나 함수내에서만 접근이 가능하다.
scope에 대한 예를 들면 a 파일에 선언되어 있는 static 변수는 a파일에서는 어느곳에서나 접근이 가능하지만 b파일 에서는 읽을 수가 없다. (file scope) 동일 파일 속에서도 a() 함수 속에서 선언된 static 변수는 a()의 어느곳에서도 접근할 수 있지만 b() 함수 에서는 접근할 수 없는 것이다. (function scope) 반면에 global 변수는 프로그램내의 어느 파일, 어느 함수에서도 읽을 수 있다.
lifetime 에 대하여 고찰해 보면 한번 선언된 전역변수와 정적변수의 값은 프로그램(프로세스)가 죽을 때까지 계속 유지된다. 따라서 미들웨어에 의해 프로세스가 통제되는 프로젝트의 경우 프로세스가 죽지 않고 항상 살아있기 때문에 매번 거래가 시작될 때 반드시 변수를 초기화 해 주어야 한다. 초기화를 빼먹을 경우 이전 거래에서 사용했던 변수 값들이 그대로 보존되어 있기 때문에 잘못된 결과를 초래할 수 있기 때문이다.
특히 국방, 금융권, 원자력과 같은 크리티컬한 사이트의 프로젝트에서는 예기치 않은 대형사고가 발생될 수 있기 때문에 각별히 신경써서 사용해야 할 것이다.
-------------------
이러한 개념은 extern 함수와 static 함수에도 똑같이 적용된다. static 함수는 해당 파일 내에서만 호출될 수 있다. 그러나 extern 함수는 다른 파일 속에서도 호출될 수 있는 것이다. 보통 extern 함수 앞에는 extern 이란 말을 생략하기도 한다. 따라서 static 이 붙지 않은 것은 extern 함수라고 간주하면 될 것이다.
---예제---
class Thing {
static int count; // static 변수 이 변수는 각 객체들 사이에서 공유된다.
String name;
Thing(String name) {
this.name = name;
++count; }
}
class StaticVariable {
public static void main(String args[]) {
Thing t1 = new Thing("Bowling Ball");
System.out.println(t1.name + " " + t1.count);
Thing t2 = new Thing("Ping Pong Ball");
System.out.println(t2.name + " " + t2.count);
Thing t3 = new Thing("Football");
System.out.println(t3.name + " " + t3.count); }
}
class StaticBag {
static boolean flag;
static int i, j = 2, k = 3, l, m;
static double array[] = { -3.4, 8.8e100, -9.2e-100 };
static String s1, s2 = new String("Hello");}
class StaticBagTest {
public static void main(String args[]) {
System.out.println(StaticBag.flag);
System.out.println(StaticBag.i);
System.out.println(StaticBag.j);
System.out.println(StaticBag.k);
for(int i = 0; i < StaticBag.array.length; i++)
System.out.println(StaticBag.array[i]);
System.out.println(StaticBag.s1);
System.out.println(StaticBag.s2); }
}
'Development > Java' 카테고리의 다른 글
[String에서 한 글자씩 읽기/추출하는 방법] (0) | 2012.04.27 |
---|---|
[StringBuffer] (0) | 2012.04.19 |
[배열 복사] (0) | 2012.04.09 |
[시간 측정] (0) | 2012.04.08 |
[랜덤함수 사용법] (0) | 2012.04.08 |