선언위치에 따른 변수에 대해 공부하던 중 클래스 변수에대해 의문이 생겼다.
실행할 때 메모리에 올라간다는게 대체 무슨 말인가?
먼저 CPU , RAM , HDD에 연관성에 대해 이해할 필요가 있다.
이론적으로 컴퓨터는 CPU와 HDD만으로 데이터 처리를 할 수 있다고 한다.
하지만 CPU에 비해 HDD는 동작속도가 매우 느리다.
CPU의 사양이 아무리 좋더라도 HDD의 데이터 전송속도가 느리기 때문에
성능이 몹시 떨어지는 것이다.
그래서 CPU와 HDD사이의 병목현상을 줄여줄 RAM이 필요하다.
RAM은 휘발성 메모리이기 때문에 HDD처럼 (반)영구적으로 데이터를 보관할 수 없지만
CPU의 데이터 처리 속도를 맞춰줄 만큼 빠르다.
RAM은 휘발성 메모리라고 하였다.
처리중 RAM에 저장되어있는 휘발성 메모리들을 영구적으로 보관하기 위해 HDD에 보내는 작업을 save라고 한다.
반대로 HDD에 있는 메모리를 RAM에 보낼 때 이것을 로딩 이라 하는데 우리가 궁금한 점에 대한 답이 바로 여기서 나온다.
클래스가 메모리에 올라갈 때란 즉 HDD에 있던 데이터가 RAM으로 전송 될 때,
프로그램이 실행될 때 를 말한다.
클래스 로더가 자바 클래스 파일을 읽어올 때 메소드영역 에 메모리가 올라가는 것이다.
그래서 우리는 클래스 변수를 전역으로 사용 가능한 것이며
ft2 클래스변수 : 4000
ft 클래스변수 : 4000
위의 두 값이 같은 이유도 객체의 생성과 관계없이
메서드영역에 메모리가 할당되기 때문이다.
pulbic class FiledTest{
int global; // 멤버변수 = 인스턴스변수
static int classVariable;//클래스 변수
public void testMethod(int num) { //메소드 영역의 시작안에 작성하는 변수
// ==> 매개변수도 일종의 지역변수로 생각
int local; //지역변수(메소드 영역에서 작성하는 변수)
System.out.println(num); // 매개변수는 호출 시 초기화된 상태로 값이 전달되어 오기때문에 가능
// 지역변수 출력 -> 지역변수는 선언 외에 다시 사용하기 위해서는 반드시 초기화가 되어잇어야 한다.
local = 100;
System.out.println(local+num);// 전역변수 클래스 전역에서 사용이 가능하고 미초기화 jvm이 기본 값을 부여해 준다.
System.out.println(global);
}
public static void main(String[] args) {
//global = 1; error -> 메모리에 아직 올라가지 않았기 때문
classVariable = 0; //-> 실행과 동시에 메모리에 올라가기 때문에 사용 가능
System.out.println("클래스변수 : "+classVariable);
FieldTest ft = new FieldTest();
ft.global = 100;
ft.classVariable = 2000;
System.out.println("ft 인스턴스변수 : "+ft.global);
System.out.println("ft 클래스변수 : "+ft.classVariable);
FieldTest ft2 = new FieldTest();
ft2.global = 300;
ft2.classVariable = 4000;
System.out.println("ft2 인스턴스변수 : "+ft2.global);
System.out.println("ft2 클래스변수 : "+ft2.classVariable);
System.out.println("ft 클래스변수 : "+ft.classVariable);
}
}
>>>
클래스변수 : 0
ft 인스턴스변수 : 100
ft 클래스변수 : 2000
ft2 인스턴스변수 : 300
ft2 클래스변수 : 4000
ft 클래스변수 : 4000