여러 인스턴스에서 공통으로 사용하는 static 변수
1. 왜 필요할까?
여러 인스턴스가 공유하는 기준 값이 필요한 경우!
EX) 학생마다 새로운 학번 생성
카드회사에서 카드를 새로 발급할때마다 새로운 카드 번호를 부여
회사에 사원이 입사할때 마다 새로운 사번이 필요한 경우
-->기준 값이 있고, 매번 새로운/원하는 데이터가 있을 때 사용
2. static 변수 선언과 사용하기
static int serialNum;
- 인스턴스가 생성될 때 만들어지는 변수(일반 멤버 변수)가 아닌, 처음 프로그램이 메모리에 로딩될 때 메모리를 할당
- 클래스 변수, 정적변수라고도 함 (vs. 인스턴스 변수)
- 인스턴스 생성과 상관 없이 사용 가능하므로 클래스 이름으로 직접 참조
프로그램이 메모리에 올라가면 프로세스가 된다.
프로세스가 스레드의 상태로 실행되게 되는데,
프로그램은 데이터/코드 영역으로 분리된다.
코드 영역에 들어가는 것은 명령어 집합->라인대로 실행
데이터 영역에 들어가는 것은 처음부터 메모리를 잡는것들 (상수/리터럴/Static)
인스턴스가 heap에 생성되었다가 사라지면 가비지콜렉터가 그 메모리를 회수
하지만 static같은 변수들은 프로그램들이 메모리에서 unload될 때 없어진다.
3. static 변수 테스트하기(1)
회사에 사원이 들어오면 사번을 차례대로 부여할 것이다!
우선 인스턴스가 만들어질 때마다 사번을 하나씩 증가시켜보자.
Employee.java
package ch16;
public class Employee {
public static int serialNum=1000;
private int employeeId;
private String employeeName;
private String department;
//속성 변수를 private로 만들고, get/set으로 변수 오용되는 것 막기!
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 ch16;
public class EmployeeTest {
public static void main(String[] args) {
Employee employeeLee =new Employee(); //(생성자를 안만들어줬지만 기본생성자가 있으니까) new해서 인스턴스 만들기!
employeeLee.setEmployeeName("이순신");
System.out.println(employeeLee.serialNum);
Employee employeeKim =new Employee();
employeeKim.setEmployeeName("김유신");
employeeKim.serialNum++;
System.out.println(employeeLee.serialNum);
System.out.println(employeeKim.serialNum);
}
}
결과
--> static 변수는 인스턴스에서 공통으로 사용하는 영역이다!
3. static 변수 테스트하기(2)
회사원이 입사할 때마다(새로운 인스턴스를 만들때마다) 새로운 사번 부여!(생성자에다가 static변수++)
Employee.java
package ch16;
public class Employee {
public static int serialNum=1000;
private int employeeId;
private String employeeName;
private String department;
public Employee(){
serialNum++;
employeeId=serialNum;
}
//속성 변수를 private로 만들고, get/set으로 변수 오용되는 것 막기!
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 ch16;
public class EmployeeTest {
public static void main(String[] args) {
Employee employeeLee =new Employee(); //(생성자를 안만들어줬지만 기본생성자가 있으니까) new해서 인스턴스 만들기!
employeeLee.setEmployeeName("이순신");
Employee employeeKim =new Employee();
employeeKim.setEmployeeName("김유신");
System.out.println(employeeLee.getEmployeeName() + "," + employeeLee.getEmployeeId());
System.out.println(employeeKim.getEmployeeName() + "," + employeeKim.getEmployeeId());
}
}
결과
4. static 변수와 메서드는 인스턴스 변수, 메서드가 아니므로 클래스 이름으로 직접 참조
System.out.println(Employee.serialNum);
//serialNum은 인스턴스가 생기기 전에 이미 만들어졌으므로, 인스턴스로 참조(employeeLee.serialNum); 말고
//클래스 이름으로 직접 참조해도 된다
참고하기 좋은 블로그
https://mangkyu.tistory.com/47?category=872426
[Java] static변수와 static 메소드
1. Static 정리 Java에서 Static 키워드를 사용한다는 것은 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미합니다. 이를 정확히 이해하기 위해서는 메모리 영역에 대한 이해가 필
mangkyu.tistory.com
'JAVA' 카테고리의 다른 글
2-14.객체 지향 - static 응용, 싱글톤 패턴(singleton pattern) (0) | 2022.01.11 |
---|---|
2-13.객체 지향 - static메서드, 변수의 유효 범위 (0) | 2022.01.11 |
2-11.객체 지향 - 객체 간의 협력(프로그래밍 예제 포함) (0) | 2022.01.09 |
2-10.객체 지향 - this (0) | 2022.01.08 |
2-9.객체 지향 - 캡슐화 (0) | 2022.01.08 |