Java

static 변수

H_u 2024. 4. 19. 16:08
728x90
반응형
SMALL

💡 학습 목표

  1. static 변수에 대한 개념을 이해하자.
  2. Runtime Data Area 에 대한 개념을 알자.
  3. static 변수에 활용

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

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

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

메모리 영역(JVM Memory, Runtime Data Area)

 

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

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

package basic.ch12;

 

// 번호를 뽑아주는기계

public class NumberPrinter {

 

private int id;

//private int waitNumber; 멤버 변수

//private static int waitNumber; // --> Method Area

// waitNumber

public static int waitNumber; // --> Method Area

 

 

public NumberPrinter(int id) {

this.id = id;

waitNumber = 1;

 

}

 

// 기능 번호표를 출력한다.

public void printWaithNumber() {

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.printWaithNumber(); //고객1

n1.printWaithNumber(); //고객2

n1.printWaithNumber(); //고객3

n1.printWaithNumber(); //고객4

 

n2.printWaithNumber(); //고객 5

n2.printWaithNumber(); //고객 6

}

 

}

 

package basic.ch12;

 

public class NumberPrinterTest2 {

 

public static void main(String[] args) {

 

// 객체 각각에 존재하는 멤버변수를 사용하려면

// 메모리에 올라가야 사용을 할 수 있다

//NumberPrinter numberPrinter1 = new NumberPrinter(1);

// static 변수를 클래스 변수라고도 불린다.

// static 변수는 클래스이름. 으로 접근 할수있다

System.out.println(NumberPrinter.waitNumber);

 

}

 

}

 

정리

실행 버튼(프로그램 실행) ---> OS부터 메모리 영역을 할당 받는다.

순서

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

도전 문제

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

 

package basic.ch12;

 

public class Company {

 

public static String companyName = "그린컴퍼니";

static int eepSerialNumber = 1000;

 

 

//코드 테스트

public static void main(String[] args) {

 

Employee emp1 = new Employee("홍길동");

System.out.println(emp1.getEmployeeId());

Employee emp2 = new Employee("이순신");

System.out.println(emp2.getEmployeeId());

Employee emp3 = new Employee("강감찬");

System.out.println(emp3.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.eepSerialNumber;

Company.eepSerialNumber++;

 

}

 

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;

}

 

}//end of class

 

 

 

 

 

 

static 을 이해하기 위해서 메모리 실행 순서(지금 단계에서의 이해)

  1. Method Area(static)
  2. Stack
  3. Heap

카드 번호가 발급 될때마다 고유한 카드 번호를 가질 수 있도록 코드를 설계.

package basic.ch12;

 

public class Card {

 

// 맴버 변수,static 변수

static int seriaNumber = 1000;

 

// 생성자

String name; // 사용자 이름

private int cardcode; // 카드번호

 

// 멤버변수

public Card(String name) {

this.name = name;

this.cardcode = Card.seriaNumber;

Card.seriaNumber++;

}

 

// get,set 작성

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

public int getCardcode() {

return cardcode;

}

 

public void setCardcode(int cardcode) {

this.cardcode = cardcode;

}

 

// 메인함수

public static void main(String[] args) {

 

Card card1 = new Card("성후");

System.out.println(card1.getCardcode());

Card card2 = new Card("성후1");

System.out.println(card2.getCardcode());

}// end of main

}// end of class

728x90
반응형
SMALL

'Java' 카테고리의 다른 글

배열에 대해서 알아 보자  (0) 2024.04.22
static 메소드(함수)  (0) 2024.04.19
ver 0.0.1 Starcraft  (0) 2024.04.19
this. 의 3가지 사용 방  (0) 2024.04.19
접근 제어 지시자  (0) 2024.04.17