오늘 면접에서 static의 생명주기에 대한 질문을 들었다.
static의 용도나 메모리에 한번 올라가고~ 이런건 알았는데 static이 언제 생성되고 언제 소멸하는지는 대충은 생각하고 있었지만
정확한 때는 몰랐던 것이다. 내가 생각하던건 선언될때 생성되고, 프로그램이 종료될때 소멸된다.. 라는 것
일단 Static이 뭔지 알아보자
- 클래스의 변수나 메소드는 해당 클래스가 인스턴스화 되기 전에는 사용할 수 없다. 하지만 static 변수나 메소드는 인스턴스의 생성과 상관없이(즉, 객체를 생성하지 않고도) 바로 접근이 가능하고, 사용이 가능하다.
- public 으로 선언되면 누구나 어디서든 접근이 가능
- JVM 은 실행과정에서 필요한 클래스의 정보를 메모리에 로딩한다. 이 로딩(Loading) 시점에서 static 변수가 초기화된다.
-
static 메소드는 해당하는 객체를 생성하지 않고도 해당 메소드를 호출하기 위한 것
-
Static 변수 정적 변수는 하나의 클래스에 하나만 존재한다. (그 클래스의 모든 객체들에 의하여 공유된다.)
메모리에 생성되는 시점: byte code가 메모리에 로딩되면서 문제없을 경우 메모리에 자동 생성된다.(메소드 영역) -
Static 메소드 객체가 생성되지 않은 상태에서 호출되는 메소드. 객체안에서만 존재하는 인스턴스 변수 및 메소드들을 내부에서 사용할 수 없다.
메소드 내부에서는 정적, 지역 변수만을 사용한다. (this 키워드도 인스턴스 변수이므로 사용 불가)
인스턴스 변수에 따라 행동이 달라지지 않기 때문에 인스턴스나 객체가 필요하지 않고, 클래스명만 있어도 된다. (일반 메소드를 사용할 때는 레퍼런스 변수를 사용한다.) - static의 생명주기
클래스 변수인 Static 변수는 클래스가 생성될 때 메모리를 할당 받고 프로그램 종료 시점에 반환되므로 사용하지 않고 있어도 메모리가 할당되어 있습니다.
스태틱 변수 소멸시기는 jvm을 실행했을 때 라는데
스태틱 변수가 있는 클래스를 로드 한 클래스 로더가 가비지 콜렉팅 될때 정작변수 역시 가비지 콜렉팅 된다 정적변수가 선언된 클래스가 로드된 상태에선 가비지 콜렉팅이 안되고 해당 클래스 로더가 가비지 콜렉팅 되면 사라진다고한다.
static이 메소드 영역에 올라가니까, 메소드 영역의 데이터는 프로그램의 시작부터 종료가 될때까지 메모리에 남아있게 된다는데.. 프로그램 시작될때 생성되고 프로그램이 종료될때 삭제된다.(프로그램 종료시점이 jvm이 종료될때)