변수 입장에서 바라본 static

Do_It·2024년 3월 26일

지역변수는 스택영역에, 객체는 힙 영역에서 관리한다.
참고로 스택 영역은 쓰레드 별로 각각 생성된다!

static 변수

static 키워드는 주로 멤버 변수와 메서드에 사용된다. 특정 클래스에서 생성된 인스턴스는 생성될 때 필드 값을 초기화한다. 만약 각각 인스턴스가 공유하는 특정 값을 가지고 싶을때는 어떡하면 좋을까? 클래스에 static 키워드를 쓰면 된다.

static 이 붙은 멤버 변수는 메서드 영역에서 관리한다.
static이 붙은 멤버 변수는 인스턴스 영역에서 생성되지 않는다. 대신 메서드 영역에서 이 변수를 관리한다.

Class내의 멤버 변수는 인스턴스가 힙 영역에 생성되면, 인스턴스 수에 맞게 멤버 변수도 힙영역에 같이 생성된다.
그러나 static이 붙은 멤버 변수는 인스턴스가 여러개 생성되더라도 메서드 영역에 딱 하나만 생성되며, 인스턴스가 static 이 붙은 멤버 변수를 공유해서 사용하는 것이다. 영문 그대로 고정된! 힙 영역에서 생성된 각각의 인스턴스는 메서드 영역에 생성되어 고정되어 있는 static 멤버 변수를 공유할 수 있는 것이다.

용어 정리

클래스에 멤버 변수가 존재

멤버 변수는 static이 붙은 것과 아닌 것에 따라 크게 두가지로 분류할 수 있다.

  • 인스턴스 변수 : static이 붙지 않은 변수 , 인스턴스에 소속되어 있고, 인스턴스가 만들어질때마다 새로 만들어진다.(초기화)
  • 클래스 변수 : static이 붙은 멤버 변수, static이 붙은 멤버 변수는 인스턴스와 무관하게 클래스에 바로 접근해서 사용할 수 있고, 클래스 자체에 소속되어 있다. 또한 클래스 변수는 자바 프로그램을 시작할 때 딱 1개만 생성되며 인스턴스가 공유하는 변수로써 사용된다.

변수와 생명주기

  • 지역 변수 : 지역 변수는 스택 영역에 있는 스택 프레임 안에 보관 됨. 메서드가 종료되면 스택 프레임도 제거 되는데, 이 때 해당 스택 프레임에 포함된 지역 변수도 함꼐 제거된다. 따라서 지역 변수는 생존 주기가 짧다.
  • 인스턴스 변수 : 인스턴스에 있는 멤버 변수를 인스턴스 변수라 한다. 인스턴스 변수는 힙 영역을 사용한다. 힙 영역은 GC가 발생하기 전까지는 생존하기 때문에 보통 지역 변수보다 생존 주기가 길다.
  • 클래스 변수 : 클래스 변수는 메서드 영역의 static 영역에 보관되는 변수이다. 메서드 영역은 프로그램 전체에서 사용하는 공용 공간이다. 클래스 변수는 해당 클래스가 JVM에 로딩 되는 순간 생성된다. 그리고 JVM이 종료될 떄 까지 생명주기가 이어진다. 따라서 가장 긴 생명주기를 가진다.

static이 정적이라는 이유
-> 힙 영역에서 생성되는 인스턴스 변수는 동적으로 생성되고 제거된다. 반면에 static 변수는 거의 프로그램 실행 시점에 생성되고 프로그램 종료 시점에 제거된다. 말 그대로 정적 변수인 것이다.

static 변수 접근

인스턴스를 통해서도 접근할 수 있다. 그러나 힙영역에 존재하는 것이 아닌 메서드 영역에 존재하는 static 변수를 반환하는 것 뿐이다. 그러나 이 방법은 권장되지 않는다. 왜냐하면 인스턴스를 변수인지 클래스 변수인지 헷갈리기 때문이다.

개발을 할때는 항상 가져다 쓰는 입장과 만드는 입장을 고려해야한다! 어떤 변수 확실하게 확인할 수 있는 것이 좋은 것이다.

profile
오늘의 노력이 내일의 성장으로 이어지고 있음을

0개의 댓글