변수는 클래스 변수, 인스턴스 변수, 지역변수 모두 세 종류가 있다.
이 종류들은 모두 선언된 위치에 따라 다르다.
멤버 변수를 제외한 나머지 변수들은 모두 지역변수이며, 멤버 변수 중 static이 붙어 있는 것은 클래스 변수, 붙지 않은 것은 인스턴스 변수이다.
class Variables {
int iv; //인스턴스 변수
static int cv; //클래스 변수(static변수, 공유변수)
void method() {
int lv = 0; //지역변수
}
}
인스턴스 변수(instance variable) - 클래스 영역에 선언되며, 인스턴스를 생성할 때 만들어진다. 그래서 인스턴스 변수(iv)의 값을 읽어 오거나 저장하려면 먼저 인스턴스를 생성해야 한다. 인스턴스마다 별도의 저장공간을 가지므로 서로 다른 값을 가질 수 있다. 인스턴스마다 고유한 상태를 유지해야하는 속성의 경우, 인스턴스 변수로 선언한다.
클래스 변수(class variable) - 클래스 변수를 선언하는 방법은 인스턴스 변수(iv) 앞에 static을 붙이기만 하면 된다. 인스턴스마다 독립적인 저장공간을 갖는 인스턴스 변수와는 달리, 클래스 변수는 모든 인스턴스가 공통된 저장공간(변수)을 공유하게 된다. 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성의 경우, 클래스 변수로 선언해야 한다.
클래스 변수는 인스턴스 변수와 달리 인스턴스를 생성하지 않고 언제라도 바로 사용할 수 있다는 특징이 있으며, '클래스이름.클래스 변수'와 같은 형식으로 사용한다.
지역변수(local variable) - 메서드 내에 선언되어 메서드 내에서만 사용 가능하며, 메서드가 종료되면 소멸되어 사용할 수 없게 된다. for문 또는 while문의 블럭 내에 선언된 지역변수는, 지역변수가 선언된 블럭{} 내에서만 사용 가능하며, 블럭{}을 벗어나면 소멸되어 사용할 수 없게 된다.
만약 아래와 같이 선언하고 클래스 변수를 수정하면 어떻게될까?
class Tv {
int tv_id;
static int pixels = 1024;
}
Tv tv1 = new Tv();
Tv tv2 = new Tv();
System.out.println(tv1.pixels); // 1024;
System.out.println(tv2.pixels); // 1024;
tv1.pixels = 1440;
System.out.println(tv1.pixels); // 1440;
System.out.println(tv2.pixels); // 1440;
위에서 보듯이 tv1의 픽셀수만 수정헀는데 tv2도 같이 바뀐다. 이는 클래스 변수는 어느 인스턴스에서나 공유되어 사용되기 때문이다.