[Java] Static variable
Static변수
-
회사에서 사원이 입사할 때마다 발급하는 사원번호, 학생의 학번 생성 등 여러개의 인스턴스에서 공유하는 변수가 필요한 경우에는 Static변수를 사용한다.
-
Static변수는 인스턴스의 생성과 상관없이 사용이 가능하므로 인스턴스가 아닌 클래스의 이름으로 직접 참조한다.
// serialNum은 static변수!
Student student1 = new Student();
student1.serial = 100;
// (X) 이렇게 인스턴스 이름을 사용해 참조하지 않고 아래와 같이 class이름으로 참조한다.
Student.serialNum = 100; // (O)
- Static변수는 다른 멤버 변수와는 다르게 인스턴스가 생성될 때 만들어지는 변수가 아니라 프로그램이 처음 로딩될 때 메모리에 할당되며 생성된다. 그래서 인스턴스를 생성하지 않고서도 Class이름을 사용하여 static변수를 불러올 수 있다.
- static변수는 인스턴스가 생성되지 않아도 이미 메모리를 잡아둔 상태라 사용가능하다. 인스턴스가 생성전에 인스턴스 데이터를 할당하는건 잘못되었기에 static 메서드 내부에서 인스턴스 변수를 사용할 수 없다.
- 하지만 반대로 다른 함수들에서 static값 변경은 가능하다.
public static int getSerialNum() { employeeName = "Lee"; // 이렇게 인스턴스 변수 사용이 안됨 (오류가 발생함) return serialNum; }
👨🏻💻 Example Code
Employee.java
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;
}
}
EmployeeTest.java
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변수는 프로그램이 메모리에 로드될 때부터 데이터 공간을 잡아둬서 배열과 같이 큰 메모리를 잡는 것은 좋지 않다.
Reference
- [Fast Campas] 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online.
Author And Source
이 문제에 관하여([Java] Static variable), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@seongwon97/Java-3lm211fk저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)