Java, static 변수 요약하기
용어 정리
static 변수 사용 코드를 살펴본다.
public class Data {
public String name;
/* static */
public static int count;
}
예제 코드의 name 과 count 는 멤버 변수이다.
멤버 변수는 static변수와 일반변수 를 분류할 수 있다.
멤버 변수 종류
- 인스턴스 변수: static 키워드가 붙지 않은
String name
멤버 변수이다.- 인스턴스 변수는 생성해야만 사용할 수 있다.
- 인스턴스 변수는 생성할 때마다 새롭게 만들어진다.
- 인스턴스에 소속되어있다.
- 클래스 변수: static 키워드가 붙은
static int count
멤버 변수이다.- 용어로는 클래스 변수, 정적 변수, static 변수로 불려오고 있다.
- 인스턴스와 다르게 클래스에 바로 접근해서 사용
- 클래스에 소속되어있다.
- 클래스 변수는 자바 프로그램 시작시 1개가 만들어진다. 여러 곳에서 공용으로 사용할 수 있다.
변수와 생명주기
- 지역 변수: 메소드 생성시 스택 영역에 있는 스택프레임에 보관, 메소드 종료시 스택 프레임 제거와 지역변수도 함께 제거된더. 가장 짦은 생명주기
- 인스턴스 변수: 인스턴스 변수는 힙 영역에 GC 발생되기 전까지 생존으로 지역 변수보다 생명주기가 길다.
- 클래스 변수: 메소드 영역의 static 영역으로 보관되는 변수, 프로그램 전체에 사용, 클래스 변수는 JVM 로딩 시 생성되며 JVM이 종료될 때까지 있으므로 가장 생명주기가 길다.
정적(Static) 이름은 다른 변수들은 동적(Dynamic)으로 제거되지만, static 은 프로그램 시작과 함께 종료할 때까지 남아있다. 정적인 변수로 불려오고 있다.
Static 멤버변수 접근 법
static 변수는 클래스와 인스턴스를 통해서 접근할 수 있다.
하지만 인스턴스를 통한 접근은 좋지 않다.
Data.java
public class Data {
public String name;
/* static */
public static int count;
public Data(String name) {
this.name = name;
Data.count++;
}
}
Main.java
public class Main {
public static void main(String[] args) {
// add new Data
Data data4 = new Data("Fourth");
// access instance field
System.out.println("Fourth Count = " + data4.count);
// add new Data
Data data5 = new Data("Fifth");
// access class field
System.out.println("Fifth Count = " + Data.count);
}
}
출력 결과
Fourth Count = 1
Fifth Count = 2
인스턴스를 통한 접근 data4.count 과 클래스를 통한 Data.count 모두 정상적으로 동작하는 것을 볼 수 있다. 하지만, 인스턴스보다 클래스를 통한 접근하는 것을 권장하는데 이는 클래스로 통한 접근을 한다면 static 변수인 것을 한 눈에 들어오기 때문이다. 인스턴스 변수로 선언한 경우 이것이 static 변수인지 일반 변수인지 클래스를 직접 확인하지 않는 한 호출하는 쪽에서는 분간하기 어렵다.