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입니다.