공통으로 사용하는 변수가 필요한 경우
여러 인스턴스가 공유하는 기준 값이 필요한 경우
ex) 학생마다 새로운 학번 생성
카드 회사에서 카드를 새로 발급할 때마다 새로운 카드 번호를 부여
회사에 사원이 입사할 때마다 새로운 사번이 필요
static 변수의 선언
ex) public static int num
인스턴스가 생성될 때 만들어지는 것이 아닌 처음 프로그램이 메모리에 로딩될 때 메모리를 할당
클래스 변수, 정적 변수, 인스턴스 변수 라고도 한다
- 프로그램을 구동하면 메모리에 프로그램이 올라간다
메모리에 올라간 상태를 프로세스 상태라고 한다
두 가지 영역
-코드영역 : 명령어 집합이 들어가서 라인마다 실행된다
-데이터영역 : 처음부터 메모리를 잡는 데이터들, 상수/리터럴/static변수, 프로그램이 다 끝나고 프로그램이 업로드 되는 순간 없어진다
반면에 인스턴스가 생성될 때마다 사용하는 메모리인 heap메모리는 동적 메모리이고 인스턴스가 사라지는 순간 garbage collector가 메모리를 수거한다
Employee.java
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() {
int num = 1; //지역변수는 상관 없고
// employeeName = "유현주"; 인스턴스 변수는 사용 불가
return serialNum; //static 변수
}
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
public class EmployeeTest {
public static void main(String[] args) {
Employee employeeYoo = new Employee();
employeeYoo.setEmployeeName("유현주");
System.out.println(employeeYoo.getSerialNum());
Employee employeeKim = new Employee();
employeeKim.setEmployeeName("김현주");
System.out.println(employeeYoo.getEmployeeName() + "님의 사번은 " + employeeYoo.getEmployeeId());
System.out.println(employeeKim.getEmployeeName() + "님의 사번은 " + employeeKim.getEmployeeId());
}
}
Company.java
public class Company {
private static Company instance = new Company();
private Company(){
}
public static Company getInstance(){
if (instance == null){
instance = new Company();
}
return instance;
}
}
CompanyTest.java
public class CompanyTest {
public static void main(String[] args) {
Company company1 = Company.getInstance(); //이미 생겨있어서 new 할 필요가 없음
Company company2 = Company.getInstance();
System.out.println(company1);
System.out.println(company2);
}
}
- 공장 클래스 - Factory
- 공장 인스턴스를 static으로 생성, 생성자를 private으로
- createCar 메서드 만들기 - Car 클래스에서 생성자로 생성
- getInstance만들기
public class Factory {
private static Factory instance = new Factory();
private Factory(){
}
public Car createCar(){
return new Car();
}
public static Factory getInstance(){
if (instance == null){
instance = new Factory();
}
return instance;
}
}
- 자동차 클래스 - Car
- 자동차 번호 생성
- 시리얼번호 static으로 생성
- 자동차 생성자 시리얼 번호 부여
public class Car {
public int carNum;
private static int serial = 10000;
public Car(){
serial++;
this.carNum = serial;
}
public int getCarNum(){
return this.carNum;
}
}