본문 바로가기
개발공부/Java

[Java] 09. Static 변수와 Static 메서드에 대하여...(1)

by sangyeon 2021. 11. 24.
728x90

1. Static 변수란?

: 여러 인스턴스에서 공통으로 사용하는 변수 (공유하여 사용)

 

* 그렇다면 공통으로 사용하는 변수가 필요한 경우는 언제일까?

- 여러 인스턴스가 공유하는 기준 값이 필요한 경우

- 학생마다 새로운 학번 생성

- 카드 회사에서 카드를 새로 발급할 때마다 새로운 카드 번호를 부여

- 회사에 사원이 입사할 때마다 새로운 사번이 필요 함

 

2. static 변수 선언과 사용하기

: static int serialNum;

- 인스턴스가 생성될 때 만들어지는 변수가 아닌, 처음 프로그램이 구동되어 메모리에 로딩될 때(process 상태) 메모리를 할당된다. (상수/Literal/static 변수)

- 클래스 변수, 정적 변수라고도 함(vs. 인스턴스 변수)

- 인스턴스 생성과 상관없이 사용 가능하므로 클래스 이름으로 직접 참조

ex) student.serialNum = 100;

- 인스턴스가 생성될 때 사용하는 메모리는 heap(동적)메모리 이고, static 변수의 경우 프로그램이 로딩될 때 사용하고 프로그램이 종료될 때 언로딩 됨.

 

3. static 변수 테스트 하기

 

- Employee.java

package ch16;

public class Employee {

public static int serialNum = 1000;

private int employeeId;
private String employeeName;
private String department;

public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}

}

> private 변수는 외부 클래스에서 접근 불가능하기 때문에 get/set으로 설정해야 한다.

 

- EmployeeTest.java

package ch16;

public class EmployeeTest {

public static void main(String[] args) {

//1. 지역변수 employeeKang(스택 메모리에 존재)
Employee employeeKang = new Employee(); 
employeeKang.setEmployeeName("강슬기");

System.out.println(employeeKang.serialNum);

//2. 지역변수 employeeLee(스택 메모리에 존재)
Employee employeeLee = new Employee();
//3. employeeLee 인스턴스가 사용하는 힙 메모리
employeeLee.setEmployeeName("이보영");
employeeLee.serialNum++; 

System.out.println(employeeKang.serialNum);
System.out.println(employeeLee.serialNum);

}
}

> 위 예제를 호출해보면 static 변수는 인스턴스에서 공통으로 사용하는 영역임을 알 수 있다.

 

* 출력결과

===========================

1000

1001

1001

===========================

위의 예제(EmployeeTest.java)에서 보는 바와 같이

main안에 Employee 타입으로 선언된 지역 변수(employeeKang)은 스택 메모리에 생성되고,

지역변수(employeeKang)로 인해 참조되는 인스턴스(멤버 변수, 메서드)는 힙메모리에 생성된다.

마지막으로 Employee 객체의 static 변수는 지역변수에서 참조 가능하고 데이터 영역에 생성된다.

 

 

4. 회사원이 입사할 때마다 새로운 사번 부여하기

 

- Employee.java

=========================
객체 생성시 static 변수에 +1을 해준다.
=========================

public Employee() {
serialNum++;
employeeId = serialNum;
}

- EmployeeTest.java

package ch16;

public class EmployeeTest {

public static void main(String[] args) {

//1. 지역변수 employeeKang(스택 메모리에 존재)
Employee employeeKang = new Employee(); 
employeeKang.setEmployeeName("강슬기");

//2. 지역변수 employeeLee(스택 메모리에 존재)
Employee employeeLee = new Employee();
//3. employeeLee 인스턴스가 사용하는 힙 메모리
employeeLee.setEmployeeName("이보영");

System.out.println(employeeKang.getEmployeeName() + "님의 학번은 " + employeeKang.getEmployeeId());
System.out.println(employeeLee.getEmployeeName() + "님의 학번은 " + employeeLee.getEmployeeId());

}

}

 

* 알아 둘 것..

여러 인스턴스에서 공통으로 공유하는 변수를 사용할 때는 static 변수가 필요하다.

 

728x90