변수의 유효 범위와 메모리
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
이렇게 참조할 수 있다.
[실행 결과]