💡 학습 목표
|
static 변수는 프로그래밍에서 중요한 개념 중 하나입니다. 클래스 변수라고도 불리며, 클래스의 모든 인스턴스가 공유하는 변수입니다. 즉, 객체가 동일한 static 변수의 값을 공유합니다.
ex) 우리는 모두 하나의 태양을 공유한다. 우리가 태어나기 전에 하나의 태양이 존재하기 때문이다.
왜 클래스 변수라고 불리는 걸까?
우리가 자바 프로그램을 실행을 하면 프로그램을 수행하기 위해 운영체제로부터 할당받는 메모리들이 존재 합니다. 그 특성에 따라 영역등이 존재 하는데 그 구성요소들은 아래와 같습니다.
메모리 영역(JVM Memory, Runtime Data Area)
package basic.ch12;
public class NumberPrinterTest2 {
public static void main(String[] args) {
// 객체 각각에 존재하는 멤버 변수를 사용하려면 메모리에 올라가야 사용을 할 수 있다.
// NumberPrinter numberPrinter1 = new NumberPrinter(1);
// static 변수를 클래스 변수라고도 불린다.
// static 변수는 클래스 이름. 으로 접근할 수 있다.
System.out.println(NumberPrinter.waitNumber);
} // end of main
}
공통으로 사용하는 변수가 필요한 경우
- 여러 인스턴스가 공유하는 기준 값이 필요한 경우
- 학생마다 새로운 학번 생성
- 카드회사에서 카드를 새로 발급할때마다 새로운 카드 번호를 부여
- 회사에 사원이 입사할때 마다 새로운 사번이 필요한 경우
- 은행에서 대기표를 뽑을 경우(2대 이상)
package basic.ch12;
// 번호 뽑아 주는 기계
public class NumberPrinter {
private int id;
// private int waitNumber; --> 멤버 변수
// static 변수는 Method Area 영역에 올라 간다.
// 즉 static waitNumber 변수는 NumberPrinter 인스턴스화 되기전에 사용 가능 하다.
public static int waitNumber;
public NumberPrinter(int id) {
this.id = id;
waitNumber = 1;
}
// 기능 -- 번호표를 출력 한다
public void printWaitNumber() {
System.out.println( id + " 번에 기기의 대기 순번은 " + waitNumber);
waitNumber++;
}
}
package basic.ch12;
public class NumberPrinterTest {
public static void main(String[] args) {
NumberPrinter n1 = new NumberPrinter(1); // 왼쪽
NumberPrinter n2 = new NumberPrinter(2); // 오른쪽
n1.printWaitNumber(); // 고객 1
n1.printWaitNumber(); // 고객 2
n1.printWaitNumber(); // 고객 3
n1.printWaitNumber(); // 고객 4
n2.printWaitNumber(); // 고객 5
n2.printWaitNumber(); // 고객 6
} // end of main
}
package basic.ch12;
public class NumberPrinterTest2 {
public static void main(String[] args) {
// 객체 각각에 존재하는 멤버 변수를 사용하려면 메모리에 올라가야 사용을 할 수 있다.
// NumberPrinter numberPrinter1 = new NumberPrinter(1);
// static 변수를 클래스 변수라고도 불린다.
// static 변수는 클래스 이름. 으로 접근할 수 있다.
System.out.println(NumberPrinter.waitNumber);
} // end of main
}
정리
실행 버튼(프로그램 실행) --> os부터 메모리 영역을 할당 받는다.
순서
- Method Area(Static)
- Statck(main)
- Heap(객체)
도전문제
회사에 사원이 입사할때 마다 새로운 사번이 필요한 경우
package basic.ch12;
public class Compamy {
public static String companyName = "그린컴퍼니";
static int empSerialNumber = 1000;
}
package basic.ch12;
public class Employee {
private int employeeId; // 멤버 변수(객체 마다 고유에 값을 가져야 한다)
private String name;
private String department;
// 요구 조건
// 사원이 존재하게 될 때 마다 고유한 사원 번호를
// 할당하고 싶다. 단 사원 번호는 중복 되어서는 안된다.
// static 과 멤버 변수에 활용
// 객체 생성자, 멤버변수, 함수를 필요하다 호출 또는 초기화 할 수 있다.
public Employee(String name) {
this.name = name;
this.employeeId = Compamy.empSerialNumber;
Compamy.empSerialNumber++;
}
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
package basic.ch12;
public class Compamy {
public static String companyName = "그린컴퍼니";
static int empSerialNumber = 1000;
// 코드 테스트
public static void main(String[] args) {
Employee employee1 = new Employee("홍길동");
System.out.println(employee1.getEmployeeId());
Employee employee2 = new Employee("이순신");
System.out.println(employee2.getEmployeeId());
Employee employee3 = new Employee("강감찬");
System.out.println(employee3.getEmployeeId());
}
}
static을 히애하기 위해서 메모리 실행 순서(지금 단계에서의 이해)
- Method Area(static)
- Stack
- Heap
카드 번호가 발급 될때마다 고유한 카드 번호를 가질 수 있도록 코드를 설계
package basic.ch12;
public class Card {
// 멤버 변수,static 변수
// 생성자
// 코드 테스트(메인 함수)
public static void main(String[] args) {
} // end of main
// 멤버 함수
// get,set 작성
} // end of class
코드
package basic.ch12;
public class Compamy {
public static String companyName = "그린컴퍼니";
static int empSerialNumber = 1000;
// 코드 테스트
public static void main(String[] args) {
Employee employee1 = new Employee("홍길동");
System.out.println(employee1.getEmployeeId());
Employee employee2 = new Employee("이순신");
System.out.println(employee2.getEmployeeId());
Employee employee3 = new Employee("강감찬");
System.out.println(employee3.getEmployeeId());
}
}
public class Card {
//멤버 변수, static 변수
private static int f_CardNum = 1000;
private static int s_CardNum = 1000;
private static int t_CardNum = 1000;
private int f_CardNumber;
private int s_CardNumber;
private int t_CardNumber;
private String cardName;
//생성자
public Card(String cardName) {
System.out.println(cardName + "가 발급되었습니다.");
f_CardNumber = f_CardNum++;
s_CardNumber = s_CardNum++;
t_CardNumber = t_CardNum++;
}
//멤버 함수
public void cardNumber() {
System.out.println("카드번호는 " + f_CardNumber + "-" + s_CardNumber + "-" + t_CardNumber);
}
//get, set 작성
public int getF_CardNumber() {
return f_CardNumber;
}
public void setF_CardNumber(int f_CardNumber) {
this.f_CardNumber = f_CardNumber;
}
public int getS_CardNumber() {
return s_CardNumber;
}
public void setS_CardNumber(int s_CardNumber) {
this.s_CardNumber = s_CardNumber;
}
public int getT_CardNumber() {
return t_CardNumber;
}
public void setT_CardNumber(int t_CardNumber) {
this.t_CardNumber = t_CardNumber;
}
public String getCardName() {
return cardName;
}
public void setCardName(String cardName) {
this.cardName = cardName;
}
//코드 테스트(메인함수)
public static void main(String[] args) {
Card card1 = new Card("신한카드");
card1.cardNumber();
System.out.println("-----------------------");
Card card2 = new Card("신한카드");
card2.cardNumber();
System.out.println("-----------------------");
Card card3 = new Card("신한카드");
card3.cardNumber();
}
}
'Java > JAVA 2 - 객체지향 핵심' 카테고리의 다른 글
JAVA 2 - 배열에 대해서 알아보자 (1) | 2024.04.22 |
---|---|
JAVA 2 - static 메소드(함수) (0) | 2024.04.19 |
ver 0.0.1 Starcrft (0) | 2024.04.18 |
JAVA 2 - this 3가지 사용 방법 (0) | 2024.04.18 |
JAVA 2 - 접근 제어 지시자 ( access modifier) (0) | 2024.04.17 |