정적 변수 = 공유 변수 = 클래스 변수
① 메서드 영역(Method Area) :
-- 클래스 정보와 클래스 변수가 저장되는 곳
② 호출스택(Call Stack) :
-- 메서드의 작업 공간
-- 메서드가 호출되면 메서드 수행에 필요한 메모리 공간을 할당받고
-- 메서드가 종료되면 사용하던 메모리를 반환
③ 힙(Heap) :
-- 인스턴스가 생성되는 공간
-- new 연산자에 의해서 생성되는 배열과 객체는 모두 여기에 생성
① 클래스 내부에서 자유롭게 접근
② 클래스 이름으로 접근
③ 객체 이름으로 접근
① 모든 객체가 동일한 정보를 공유해야 할 때
② 클래스에서 바로 호출해야 할 필요성이 있을 때
인스턴스 함수 생성 시기보다 static 함수 메모리 생성 시기 순위가 상위이기 때문에
( static 함수가 먼저 생성 후 인스턴스 변수가 생성 )
static 변수가 메모리에 먼저 생성되었기 때문에 호출할 수 있는 것이다.
class ClassVar {
int var = 10;
public static void main(String[] args) {
System.out.println(var); //에러나는 이유?
int num = 10;
System.out.println(num); //에러가 안나는 이유?
}
}
① System.out.println(var); //에러나는 이유?
static이 먼저 선언되지 않았기 때문에 int var = 10; 인스턴트 함수는 선언 되지 못한다.
② System.out.println(num); //에러가 안나는 이유?
static이 먼저 선언(메모리 할당) 되었고 지역 변수라 에러가 나지 않는다.
인스턴스 생성과 관계없이 제일 먼저 호출되는 메소드이기 때문이다.