[Java] 여러 인스턴스에서 공통으로 사용하는 static 변수

miyeon·2023년 3월 24일
0
post-thumbnail

메모리 공간

  • 데이터 영역 ( 콘스탄트 영역 )
    프로그램이 로드 될 때부터 언로드 될 때까지 존재하는 영역
  • 동적 메모리 ( 힙 메모리 )
    생성된 인스턴트가 할당되는 영역
    참조변수가 사라지면 가비지 컬렉터에 의해서 힙 메모리 영역에서 삭제된다.
  • 스택 메모리
    지역 변수가 할당되는 영역

변수의 유효 범위와 메모리

static 변수

static변수는 데이터영역에 생긴다. 그래서 static변수 사용시 클래스 이름으로 참조하여 사용하는 것이 보편적이다.
static변수는 프로그램이 메모리에 있는 동안 계속 그 영역을 차지하므로 너무 큰 메모리를할당하는 것은 좋지 않다. (ex : 배열)

인스턴스 변수

인스턴스 변수가 많으면 인스턴스가 생성될 때마다 메모리를 많이 차지하게 된다. 클래스의 속성이 될 수 있는 내용 및 클래스 내부의 여러 메서드에서 사용하는 변수는 인스턴스 변수로 선언하는 것이 좋음



아래는 여러개의 인스턴스가 하나의 메모리를 공유하는 것을 알 수 있는 소스코드이다.

[객체]

package ch16;

public class Employee {
	
	public static int serialNum = 1000;

	private int employeeId;
	private String employeeName;
	private String department;
	
	public Employee() {	
		serialNum++;	
		employeeId = 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;
	}
	
	
}

private으로 선언한 변수를 반환하는 get()/set()메서드 작성시
Generate Getters and Setters 를 사용하면 자동으로 각 변수마다 메서드를 만들어 준다.
serialNum을 바로 사번 id로 사용하여 인스턴스가 추가 될 때마다 1씩 증가시켜 사원마다 다른 사번 id를 부여하려고 한다면, 해당 변수는 모든 인스턴스가 메모리를 공유하고 있기 때문에 모든 사원이 같은 사번id를 갖게 된다.
따라서 employeeId에 값을 복사해서 부여한다.

[메인 클래스]


package ch16;

public class EmployeeTest {

	public static void main(String[] args) {

		Employee employeeLee = new Employee();
		employeeLee.setEmployeeName("이순신");
				
		Employee employeeKim = new Employee();
		employeeKim.setEmployeeName("김유신");
		
		System.out.println(employeeLee.getEmployeeName() + "님의 사번은 " + employeeLee.getEmployeeId() + "입니다.");
		System.out.println(employeeKim.getEmployeeName() + "님의 사번은 " + employeeKim.getEmployeeId() + "입니다.");
	
		System.out.println(Employee.serialNum);	//static변수는 클래스로 참조해서 많이 사용한다.
	}

}

Employee 타입으로 선언된 employeeLee, employeeKim은 지역변수이다.
serialNum은 static 변수로, 프로그램이 로드 될 때 이미 메모리에 할당이 되었기 때문에 참조변수가 아닌 클래스 이름으로 Employee.serialNum 이렇게 참조할 수 있다.

[실행 결과]

profile
내가 보려고 기록하는 블로그

0개의 댓글