static 변수 - 12

static 변수 - 12

💡 학습 목표
    1. static 변수에 대한 개념을 이해하자.

1. static 변수에 대한 개념을 이해하자.

  • static 변수는 프로그래밍에서 중요한 개념 중 하나이다. 클래스 변수라고도 불리며, 클래스의 모든 인스턴스가 공유할 수 있는 변수이다. 즉, 객체가 동일한 static 변수의 값을 공유한다.

왜 클래스 변수라고 불리는 걸까?

  • 우리가 자바 프로그램을 실행을 하면 프로그램을 수행하기 위해 운영체제로부터 할당받는 메모리들이 존재 한다. 그 특성에 따라 영역등이 존재 하는데 그 구성요소들은 아래와 같다.
  • 메모리 영역(JVM Memory, Runtime Data Area)

공통으로 사용하는 변수가 필요한 경우

  • 여러 인스턴스가 공유하는 기준 값이 필요한 경우
  • 학생마다 새로운 학번 생성
  • 카드회사에서 카드를 새로 발급할때마다 새로운 카드 번호를 부여
  • 회사에 사원이 입사할때 마다 새로운 사번이 필요한 경우
  • 은행에서 대기표를 뽑을 경우(2대 이상)

예시코드

package basic.ch12;

// 번호 뽑아 주는 기계
public class NumberPrinter {
	
	private int id;
	// private int waitNumber; 멤버 변수
	// static 변수 --> Method Area 
	// waitNumber 먼저 올라감 
	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부터 메모리 영역을 할당 받는다.

순서

  1. Method Area(Static)
  2. Statck(main)
  3. Heap(객체)

도전 문제

회사에 사원이 입사할때 마다 새로운 사번이 필요한 경우

package basic.ch12;

public class Company {

	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());
	}
}
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 = ++Company.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 Card {
	
	// 멤버 변수, static 변수
	static int cardNumberCount = 1;
	String ownerName;
	String type;
	int cardNumber;
	
	// 생성자
	public Card(String ownername, String type) {
		this.ownerName = ownername;
		this.type = type;
		cardNumber = issueCardNumber();
	}
	
	// 멤버 함수
	public void showInfo() {
		System.out.println(ownerName + "님의 카드는 " + type + "이고, 번호는 " + cardNumber + "입니다.");
	}
	public int issueCardNumber() {
		return cardNumberCount++;
	}
	
	// get, set 작성
	public String getOwnerName() {
		return ownerName;
	}
	public String getType() {
		return type;
	}
	public int getCardNumber() {
		return cardNumber;
	}
	public void setOwnerName(String ownerName) {
		this.ownerName = ownerName;
	}
	public void setType(String type) {
		this.type = type;
	}

	// 코드 테스트(메인함수)
	public static void main(String[] args) {
		Card card1 = new Card("홍길동", "체크카드");
		Card card2 = new Card("이순신", "신용카드");
		Card card3 = new Card("강감찬", "교통카드");
		card1.showInfo();
		card2.showInfo();
		card3.showInfo();

	} // end of main
	
} // end of class

Java 객체지향 핵심 - 2 으로 돌아가기

 

'Java > Java 객체 지향 핵심' 카테고리의 다른 글

static 메소드(함수) - 13  (0) 2024.04.19
팀 프로젝트 연습 fantasy  (0) 2024.04.18
ver 0.0.1 Starcraft - 11  (0) 2024.04.18
this 3가지 사용 방법 - 10  (0) 2024.04.18
접근 제어 지시자 - 9  (0) 2024.04.17