자바 언어를 공부했음에도 클래스 변수와 인스턴스 변수의 차이점을 모르고 사용해왔단거같아 정리를 해보려고 한다.
인스턴스 변수는 인스턴스가 생성될 때 생성된다. 그렇기 때문에 인스턴스 변수의 값을 읽어오거나 저장하려면 인스턴스를 먼저 생성해야한다. 인스턴스 별로 다른 값을 가질 수 있으므로, 각각의 인스턴스마다 고유의 값을 가져야할 때는 인스턴스 변수로 선언한다.
클래스 변수는 인스턴스 변수에 static만 붙여주면된다. 인스턴스 변수는 각각 고유한 값을 가지지만 클래스 변수는 모든 인스턴스가 공통된 값을 공유하게 된다. 한 클래스의 모든 인스턴스들이 공통적인 값을 가져야할 때 클래스 변수로 선언한다. 클래스가 로딩될 때 생성되어(메모리에 딱 한 번 올라간다.) 종료될 때 까지 유지되는 클래스 변수는 public 을 붙이면 같은 프로그램 내에서 어디서든 접근 가능한 전역변수가 된다. 또한 인스턴스 변수의 접근법과 다르게 인스턴스를 생성하지 않고 클래스이름.클래스변수명을 통해 접근이 가능하다.
아래 예제를 살펴보자.
Test라는 클래스를 생성한 후 클래스 변수 cVar와 인스턴스 변수 iVar를 선언한다. test1, test2라는 객체 두개를 생성하고 클래스 변수와 인스턴스 변수를 수정하고 출력해보았다.
클래스 변수는 처음 생성되고 동일한 객체를 test1, test2가 서로 공유하기 때문에 수정된 값이 바뀌지만 인스턴스 변수는 객체 생성 시 마다 새로운 메모리에 할당되기 때문에 test1.iVar만 변경되었다.
public static class Test {
static int cVar = 10;
int iVar = 20;
}
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test();
System.out.println(test1.cVar + ", " + test1.iVar);
System.out.println(test2.cVar + ", " + test2.iVar);
test1.cVar = 100;
test1.iVar = 200;
System.out.println(test1.cVar + ", " + test1.iVar);
System.out.println(test2.cVar + ", " + test2.iVar);
}
// 결과
10, 20
10, 20
100, 200
100, 20