static 키워드가 붙은 멤버를 정적 멤버(static member)라고 부른다.
정적 멤버(static 변수/메서드)는 인스턴스를 따로 생성하지 않아도, 클래스명.멤버명
으로 사용 가능하다.
(물론 정적 멤버도 객체를 생성한 이후 참조변수를 통해 사용이 가능하지만, 정적 멤버임을 표시하기 위해서 클래스명.멤버명
의 형태로 사용할 것을 권장하고 있다.)
클래스에 포함된 변수
필드는 두 가지 변수로 나뉜다.
1) 클래스 변수
static
변수2) 인스턴스 변수
non-static
변수1) 클래스 메서드(정적 메서드)
2) 인스턴스 메서드
⭐ 정적 메서드 내부에서는 (자기 자신의) 인스턴스 변수 또는 인스턴스 메서드를 사용할 수 없다.
정적 메서드는 인스턴스의 생성 없이 호출이 가능하다.
정적 메서드가 호출되었을 때, 인스턴스가 존재하지 않을 수 있기 때문에 정적 메서드 내부에서는 인스턴스 변수/메서드는 사용 불가능하다!
이를 좀 더 자세하게, 설명해보자면
컴파일러가 바이트 코드(.class)를 만들 때까지가 컴파일 타임
이고
컴파일을 마친 후, 바이트 코드(.class)를 JVM이 해석/실행하는 순간부터 런타임
이다.
컴파일
이 완료되고 클래스 로더가 바이트 코드(.class)를 가져와서 클래스 영역에 로드했을 때, 클래스와 static 메모리가 할당되어 static 멤버를 사용할 수 있게 된다.
인스턴스 변수는 런타임 중 new 연산자
를 만났을 때, 힙 영역에 메모리를 할당받아 생성되고 이후에 사용할 수 있다.
즉, static 멤버는 런타임 내내 언제나 사용이 가능하지만, static 멤버를 사용하는 시점에 인스턴스 멤버가 존재한다는 것을 확신할 수가 없다.
이러한 이유로 static 멤버(메서드/내부 클래스)에선 인스턴스 멤버를 사용할 수 없다!
(컴파일 -> 런타임 때 언제 생성되고 로드 되는지에 따라서, 시점에 따라서 달라지는 문제에요)