static 멤버란 클래스 멤버라고 생각하면 된다. 즉 객체마다 생기는 것이 아니라 클래스당 하나만 생성되는 전역 변수라고 생각하면 된다. 앞에 static 을 붙여서 생성하며, 객체를 생성하지 않아도사용할 수 있다. 또 동일한 클래스의 모든 객체에 의해 공유된다.
클래스가 로드됨과 동시에 스태틱 멤버와 메소드도 메모리에 로드된다.
잠깐 자바의 메모리 레이아웃을 보자면, 객체를 생성하면 객체는 heap 이라는 공간에 할당이 되게 된다. 또 main 에서 함수를 만나면 함수는 stack 이라는 곳에 가게 된다. 만약 Main 에서 객체가 호출된다면, 그 객체의 레퍼런스를 이용해 heap 에 있는 객체를 읽어오게 된다.
그래서 non-static 과 static 의 차이를 보자면, non-static 은 객체가 생성될 때 멤버가 생성되며 멤버가 객체마다 별도로 존재하는 반면, static 은 클래스 당 멤버 하나가 생성되며 클래스가 로딩되는 순간 같이 메모리의 별도 공간! (heap 이 아닌 클래스가 저장되는 공간)에 로딩된다. 따라서 객체가 사라져도 멤버는 사라지지 않으며 라이 프 사이클은 프로그램의 라이프 사이클과 같다. 즉 프로그램이 종료되어서야 죽는다.
먼저 객체를 이용해 접근하는 경우를 살펴보자. static 은 클래스의 전역변수와 같다고 했으니 모든 객체에서 접근 가능하다. 근데 이러면 이것이 static 인지 non static 인지 헷갈리게 된다. 따라서 이런 방법은 비추이다 .
위의 샘플과 같이 클래스 이름 다음에 접근하고 싶은 static 변수를 써주면 이것이 static 이구나를 확실하게 알 수 있다.