지역변수는 스택영역에, 객체는 힙 영역에서 관리한다.
참고로 스택 영역은 쓰레드 별로 각각 생성된다!
static 변수
static 키워드는 주로 멤버 변수와 메서드에 사용된다. 특정 클래스에서 생성된 인스턴스는 생성될 때 필드 값을 초기화한다. 만약 각각 인스턴스가 공유하는 특정 값을 가지고 싶을때는 어떡하면 좋을까? 클래스에 static 키워드를 쓰면 된다.
static 이 붙은 멤버 변수는 메서드 영역에서 관리한다.
static이 붙은 멤버 변수는 인스턴스 영역에서 생성되지 않는다. 대신 메서드 영역에서 이 변수를 관리한다.
Class내의 멤버 변수는 인스턴스가 힙 영역에 생성되면, 인스턴스 수에 맞게 멤버 변수도 힙영역에 같이 생성된다.
그러나 static이 붙은 멤버 변수는 인스턴스가 여러개 생성되더라도 메서드 영역에 딱 하나만 생성되며, 인스턴스가 static 이 붙은 멤버 변수를 공유해서 사용하는 것이다. 영문 그대로 고정된! 힙 영역에서 생성된 각각의 인스턴스는 메서드 영역에 생성되어 고정되어 있는 static 멤버 변수를 공유할 수 있는 것이다.
용어 정리
클래스에 멤버 변수가 존재
멤버 변수는 static이 붙은 것과 아닌 것에 따라 크게 두가지로 분류할 수 있다.
변수와 생명주기
static이 정적이라는 이유
-> 힙 영역에서 생성되는 인스턴스 변수는 동적으로 생성되고 제거된다. 반면에 static 변수는 거의 프로그램 실행 시점에 생성되고 프로그램 종료 시점에 제거된다. 말 그대로 정적 변수인 것이다.
static 변수 접근
인스턴스를 통해서도 접근할 수 있다. 그러나 힙영역에 존재하는 것이 아닌 메서드 영역에 존재하는 static 변수를 반환하는 것 뿐이다. 그러나 이 방법은 권장되지 않는다. 왜냐하면 인스턴스를 변수인지 클래스 변수인지 헷갈리기 때문이다.
개발을 할때는 항상 가져다 쓰는 입장과 만드는 입장을 고려해야한다! 어떤 변수 확실하게 확인할 수 있는 것이 좋은 것이다.