클래스 하나에서 생성되는 여러개의 인스턴스가 하나의 값을 공유할 필요가 있을 때 사용하는 변수로 하나의 변수
인스턴스가 힙메모리에 생성되는 것과는 다르게 다음 그림과 같이 데이터 영역 메모리에 생성되며 인스턴스의 생성과 상관없이 사용할 수 있습니다.
클래스 이름으로 참조되며 Student 클래스에 serialNum이라는 스태틱 변수를 참조한다면 Student.serialNum으로 사용할 수 있습니다.
예제, Student클래스에 학생 인스턴스가 새로 생성될 때 마다 Student ID를 부여하시오
public class Student {
//1번
private static int serialNum = 1000;
private int studentID;
public String studentName;
//2번
public Student(String name) {
studentName = name;
serialNum++;
studentID = serialNum;
}
//3번
public int getStudentID() {
return studentID;
}
public static int getSerialNum() {
return serialNum;
}
}
public class StudentIdTest {
public static void main(String[] args) {
//1번
Student studentLee = new Student("Lee");
System.out.println(Student.getSerialNum());//1001
Student studentSon = new Student("Son");
System.out.println(Student.getSerialNum());//1002
//2번
System.out.println(studentSon.getStudentID());//1002
System.out.println(studentLee.getStudentID());//1001
}
예제의 static변수인 serialNum과 참조변수, 각 인스턴스의 관계는 위의 그림과 같습니다. 그리고 증가된 serailNum이 대입되는 studentID변수는 각각의 인스턴스에 담기게 됩니다.
static 변수를 위한 기능을 제공하는 메서드로 static메서드와 마찬가지로 클래스명.으로 참조해서 사용합니다.
public static int getSerialNum() {
int i = 0; // 지역변수는 사용가능
studentName = "Lee"; //에러 - 멤버변수는 사용불가
return serialNum;
}
위의 예제와 같이 static 메서드안에서 int i =0과 같은 지역변수는 함수안에서만 사용하고 소멸되는 변수이기에 사용가능합니다. 하지만 studentName같은 멤버변수는 사용할 수 없는데 그 이유는 static메서드는 인스턴스의 생성여부와 상관없이 사용할수 있는 메서드이지만 멤버변수는 인스턴스의 생성이 필수이기 때문입니다. static메서드를 사용하는 순간에 인스턴스가 없다면 오류가 날수 밖에 없는 변수이기 때문에 사용이 불가능합니다.
변수유형 별로 어디에서 어떤 변수를 사용해야 하는지를 배워야 메모리 사용을 최적화 하고 에러를 줄이는 프로그래밍을 할 수 있기에 잘 이해해야 합니다.