[Java] static 변수 - 주문번호 순서표 만들어보기
정적 변수 (static 변수)
: 인스턴스가 생성될 때 만들어지는 변수가 아닌, 처음 프로그램이 메모리에 로딩될 때 메모리를 할당한다.
정적 변수는 여러 인스턴스가 공유하는 기준 값이 필요한 경우에 쓰여진다.
- 학생마다 새로운 학번이 생성되는 경우
- 회사에 사원이 입사할 때 마다 새로운 사번이 필요한 경우,
- 은행에서 2대 이상의 번호표에서 대기표를 뽑을 경우 등
위와 같은 상황에서 잘 쓰인다
선언 방법
static 데이터형 변수명;
사용 방법
인스턴스 생성과 상관없이 사용 가능하기 때문에 클래스 이름으로 직접 참조한다.
클래스명.변수명 = 값; // 초기화
주문 순서표 예시 코드
public class NumberPrinter {
// 멤버변수
private String method; // 주문방법
public static int orderNum; // 대기번호
// 생성자
public NumberPrinter(String method) {
this.method = method;
orderNum = 1;
}
// 주문표 메서드
public void printOrderNum(String name) {
System.out.println("("+ method + ") " + name + " 고객님 주문번호는 " + orderNum + " 번 입니다.");
orderNum++;
}
}
주문방식이 달라도 주문번호는 공유되며 순서대로 증가하도록 하기 위해서
waitNumber 변수에 static 키워드를 붙여 주었다.
생성자에 주문방법을 매개변수로 받고, orderNum 을 초기화 해주었다.
printOrderNum 메소드에는 고객이름(name)을 매개변수로 받아서 출력해주고,
orderNum을 1씩 증가시킨다.
public class Starbucks {
public static void main(String[] args) {
NumberPrinter dT = new NumberPrinter("Drive Thru");
NumberPrinter app = new NumberPrinter("Siren Order");
dT.printOrderNum("쟈니");
app.printOrderNum("태일");
app.printOrderNum("재현");
dT.printOrderNum("유타");
dT.printOrderNum("도영");
dT.printOrderNum("마크");
app.printOrderNum("동혁");
app.printOrderNum("정우");
dT.printOrderNum("태용");
}
}
main 함수가 있는 클래스에서
Drive Thru와 Siren Order로 주문방식을 달리해 객체화시킨다.
방식을 번갈아가며 주문을 받아보고, 실행을 시켜보면
아래와 같이 번호가 순차적으로 증가되어서 잘 출력되었다.
static 변수는 인스턴스들이 공유하는 영역이다.
프로그램을 실행하면
1. static data 영역이 먼저 실행이 되고,
2. stack 영역의 인스턴스 변수들에 저장되어 있는 참조값으로
3. heap 메모리영역에서 참조가 되어지게 되는 순서로 이뤄진다.