public class Data3 {
public String name; // 인스턴스 변수
public static int count; // 클래스 변수 (정적 변수, static 변수)
}
예제 코드에서 name
, count
는 멤버 변수이다.
멤버 변수(필드)는 static
이 붙은 것과 아닌 것에 따라 다음과 같이 분류할 수 있다.
static
이 붙지 않은 멤버 변수, 예) name
static
이 붙지 않은 멤버 변수는 인스턴스를 생성해야 사용할 수 있고, 인스턴스에 소속되어 있다. 따라서 인스턴스 변수라 한다.static
이 붙은 멤버 변수, 예) count
static
변수 등으로 부른다. 용어를 모두 사용하니 주의!static
이 붙은 멤버 변수는 인스턴스와 무관하게 클래스에 바로 접근해서 사용할 수 있고, 클래스 자체에 소속되어 있다. 따라서 클래스 변수라 한다.static
영역에 보관되는 변수이다. 메서드 영역은 프로그램 전체에서 사용하는 공용 공간이다. 클래스 변수는 해당 클래스가 JVM에 로딩 되는 순간 생성된다. 그리고 JVM이 종료될 때 까지 생명 주기가 이어진다. 따라서 가장 긴 생명 주기를 가진다.힙 영역에 생성되는 인스턴스 변수는 동적으로 생성되고 제거된다.
반면 static
인 정적 변수는 거의 프로그램 실행 시점에 딱 만들어지고, 프로그램 종료 시점에 제거된다. 정적 변수는 이름 그대로 정적이다.
static
변수는 클래스를 통해 바로 접근할 수 있고, 인스턴스를 통해서도 접근할 수 있다.
// 추가
// 인스턴스를 통한 접근
Data3 data4 = new Data3("D");
System.out.println(data4.count);
// 클래스를 통한 접근
System.out.println(Data3.count);
둘의 차이는 없다. 결과적으로 정적 변수에 접근한다.
data4.count
정적 변수의 경우 인스턴스를 통한 접근은 추천하지 않는다. 왜냐하면 코드를 읽을 때 마치 인스턴스 변수에 접근하는 것처럼 오해할 수 있기 때문이다.
Data3.count
정적 변수는 클래스에서 공용으로 관리하기 때문에 클래스를 통해서 접근하는 것이 더 명확하다. 따라서 정적 변수에 접근할 때는 클래스를 통해서 접근하자.