지역안에서 선언된 변수
- 그 영역의 닫는 중괄호 } 를 만났을 때 메모리에서 해제된다.
- 사용자가 직접초기화 해야한다.
- 다른 영역에서 접근할 수 없기 때문에 보안성이 뛰어나다.
클래스 영역 안에 있고, 전체 영역에서 사용가능한 변수
- 클래스 영역 외의 어떠한 영역에도 포함되어 있지 않다.
- new를 만났을 때 초기화 된다.
- 프로그램 종료시 메모리에서 해제된다.
- 다른 영역에서도 접근 할 수 있기 때문에 보안성이 상대적으로 낮다.
컴파일을 하게 되면 가장 먼저 메모리에 올라가고 어떠한 경우에도 초기화가 되지 않는다.
- 단, 프로그램 종료시 메모리에서 해제 된다.
- 메모리에 고정되기 때문에 남용시 메모리 부족 혹은 프로그램 실행 속도에 악영향을 준다.
그러면 전역변수와 static의 차이를 알아보자.
int data변수를 VariableTest클래스에 선언하였고
f(1씩증가), f2메서드를 각각 선언해두었다.
main에서 VariableTest클래스에 접근을 해보자.
접근하기 위해서는 객체화가 필요하다.
추상적개념을 실체화를 시켜주자.
VariableTest vt = new VariableTest();
추상적인 개념을 실체화시켜주는 객체가 vt 이고
vt를 통해서 VariableTest안에 있는 애한테 접근할 수 있다.
직접접근하지 않고 객체로 접근, 클래스를 객체로 바꿔준다. => 객체화
vt.f(); //1
vt.f();
vt.f();
vt.f();
vt.f();
vt.f(); //6
vt.f2();
vt.f();
까지만 한 결과를 보자. (위 사진에 있는 거로 보면 안됨)
vt.f( )를 연속으로 적은건 1~6까지 출력이 되었다.
그런데 f2의 vt.f2(); 는 아무것도 출력이 되지 않는다.
이어서 vt.f( )를 출력해보니 20이라는 값에 +1이 되어서 출력이 되었다.
이유 =>
f2의 data는 20이라는 값을 가지고 있으며 data를 20으로 바꿔주는 역할만 한다.
그러고 나서 vt.f(); 적게된것임으로 +1되어서 21출력된다.
vt = new VariableTest( );
new로 초기화를 다시 해주었다.
vt가 new를 만나는 순간 다시 읽는다 => 1이 출력이 된다.
전역변수는 new를 만나는 순간 초기화된다!!
초기화되지 않고 그대로 유지하고 싶다면 static사용을 하자.
VariableTest 클래스에서 data 변수에 static 사용.
static int data = 0;
돌아가는 구조를 살펴보자면 vt = new~ 를 만나서 VariableTest클래스로 가서 읽는다.
읽는데 staitc이 보이네? 바로 이미 올라가있는지 확인을 한다.
이미 올라가있으면 초기값을 넣지 않고 그대로 진행한다.
static을 사용한 결과.