Java & Kotlin
[Java 객체지향] Static 변수
Sue
2022. 1. 27. 16:06
Static 변수
- 인스턴스는 각각 다른 메모리 공간에 할당되어 다른 멤버 변수 값을 가진다.
- 하지만 같은 클래스에서 공유해야 할 변수가 필요한 경우가 발생할 수 있다.
- 예를 들어 고유 번호를 만든다고 할 때 중복된 값이 생성되면 안된다. (e.g. 학번, 카드번호, 사번 ...)
- static 변수는 이를 판단하기 위한 기준값을 설정하는데 쓰인다.
- 클래스 변수, 정적 변수라고도 한다.
Static 변수의 메모리 공간
- 인스턴스는 동적 메모리인 힙 메모리에 생성된다.
- static 변수는 인스턴스가 생성될 때 만들어지지 않고 프로그램이 메모리에 로드되는 순간 생성된다.
- 프로그램이 메모리에 로드되면 Data 영역, Code 영역 두가지 영역으로 나뉘어진다.
- static 변수는 프로그램이 메모리에서 unload 되는 순간 소멸된다.
- 그러므로 static 변수는 인스턴스 생성 전에 생성되므로 인스턴스의 생성과 무관하게 사용이 가능하다.
- 변수 사용 시 클래스 이름으로 직접 참조한다.

예제 코드
사원의 사번을 부여하는 프로그램
Employee.java
package ch15;
public class Employee {
public static int serialNum = 1000; // static 변수 초기화
private int employeeId;
private String employeeName;
private String department;
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;
}
}
EmployeeTest.java
package ch15;
public class EmployeeTest {
public static void main(String[] args) {
Employee employeeLee = new Employee();
employeeLee.setEmployeeName("Lee");
System.out.println(employeeLee.serialNum); // 초기화 값 출력
Employee employeeKim = new Employee();
employeeKim.setEmployeeName("Kim");
employeeKim.serialNum++; // serialNum 증가
System.out.println(employeeLee.serialNum); // studentLee의 serialNum 출력
System.out.println(employeeKim.serialNum); // studentKim의 serialNum 출력
}
}
수행 결과
employeeKim 인스턴스의 serialNum만 증가시켰지만 serialNum은 각 인스턴스가 공유하는 static 변수이므로 두 인스턴스가 출력한 값이 같은 것을 알 수 있다.
1000
1001
1001
중복값 없이 멤버 변수인 employeeId가 인스턴스마다 다른 값을 갖게 하려면?
→ Employee 생성자 내부에서 static 변수 serialNum을 증가시키고 이를 멤버변수에 복사해주면 된다.
public Employee() {
serialNum++;
this.employeeId = serialNum; // serial num 멤버 변수에 복사
}
생성자 추가 후 EmployeeTest.java
- Employee 인스턴스 생성할 때 마다 employeeId 변수에 1000부터 연속된 값 부여
- static 변수는 인스턴스 생성과 관계 없으므로 클래스 이름으로 참조해서 사용하는 것이 좋다. (오류 발생은 X)
package ch15;
public class EmployeeTest {
public static void main(String[] args) {
Employee employeeLee = new Employee();
employeeLee.setEmployeeName("Lee");
System.out.println(employeeLee.serialNum); // serialNum은 클래스 변수. 인스턴스의 생성과 상관없이 사용 가능
// System.out.println(Employee.serialNum); static 변수는 클래스 이름으로 참조해서 많이 사용
Employee employeeKim = new Employee();
employeeKim.setEmployeeName("Kim");
System.out.println(employeeLee.getEmployeeName() + "님의 사번은 " + employeeLee.getEmployeeId() + "입니다.");
System.out.println(employeeKim.getEmployeeName() + "님의 사번은 " + employeeKim.getEmployeeId() + "입니다.");
}
}
수행 결과
1001
Lee님의 사번은 1001입니다.
Kim님의 사번은 1002입니다.