회사에서 사원이 입사할 때마다 발급하는 사원번호, 학생의 학번 생성 등 여러개의 인스턴스에서 공유하는 변수가 필요한 경우에는 Static변수를 사용한다.
Static변수는 인스턴스의 생성과 상관없이 사용이 가능하므로 인스턴스가 아닌 클래스의 이름으로 직접 참조한다.
// serialNum은 static변수!
Student student1 = new Student();
student1.serial = 100;
// (X) 이렇게 인스턴스 이름을 사용해 참조하지 않고 아래와 같이 class이름으로 참조한다.
Student.serialNum = 100; // (O)
- static변수는 인스턴스가 생성되지 않아도 이미 메모리를 잡아둔 상태라 사용가능하다. 인스턴스가 생성전에 인스턴스 데이터를 할당하는건 잘못되었기에 static 메서드 내부에서 인스턴스 변수를 사용할 수 없다.
- 하지만 반대로 다른 함수들에서 static값 변경은 가능하다.
public static int getSerialNum() { employeeName = "Lee"; // 이렇게 인스턴스 변수 사용이 안됨 (오류가 발생함) return serialNum; }
package ch17;
public class Employee {
private static int serialNum = 1000;
private int employeeId;
private String employeeName;
private String department;
public Employee() {
serialNum++;
employeeId = serialNum;
}
public static int getSerialNum() {
return serialNum;
}
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
package ch17;
public class EmployeeTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Employee employee1 = new Employee();
employee1.setEmployeeName("이순신");
System.out.println(Employee.getSerialNum());
Employee employee2 = new Employee();
employee2.setEmployeeName("김유신");
System.out.println(employee1.getEmployeeName() + "님의 사번은 " + employee1.getEmployeeId());
System.out.println(employee2.getEmployeeName() + "님의 사번은 " + employee2.getEmployeeId());
}
}
멤버 변수가 너무 많으면 인스턴스를 생성할 때 쓸데없는 메모리가 많이 할당되어 좋은 프로그램이 아니다. 그래서 멤버 변수는 class의 속성이 될 수 있는 것들로만 적당히 사용하는게 좋다.
클래스 내부의 여러 메서드에서 사용하는 변수는 멤버 변수로 선언하는 것이 좋다.
Static변수는 프로그램이 메모리에 로드될 때부터 데이터 공간을 잡아둬서 배열과 같이 큰 메모리를 잡는 것은 좋지 않다.