상세 컨텐츠

본문 제목

[JAVA] 기초 - static 변수

JAVA/Java 기초

by 미로910 2024. 5. 20. 17:52

본문

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

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

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

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

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

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

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

// 번호 뽑아 주는 기계
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++;
	}
	
	
}
public class NumberPrinteTest {

	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(); //고객 5
		
	}

}

실행 결과______

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

순서

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

 

🔥도전!!

회사에 사원이 입사할때 마다 새로운 사번이 필요한 경우
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;
	}
	
}

 

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.getEmplyeeId());

		Employee employee2 = new Employee("이순신");
		System.out.println(employee2.getEmplyeeId());

		Employee employee3 = new Employee("강감찬");
		System.out.println(employee3.getEmplyeeId());
	}
}

실행 결과_____

 

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

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

 

카드 번호가 발급 될때마다 고유한 카드 번호를 가질 수 있도록 코드를 설계.
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();
    }

}

실행 결과______

관련글 더보기