Burninghering's Blog
article thumbnail
Published 2022. 1. 11. 01:07
2-12.객체 지향 - static 변수 JAVA

여러 인스턴스에서 공통으로 사용하는 static 변수

1. 왜 필요할까?

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

EX) 학생마다 새로운 학번 생성

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

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

-->기준 값이 있고, 매번 새로운/원하는 데이터가 있을 때 사용

하나의 클래스에서 여러개의 인스턴스(Lee,Kim)를 만들어도 각자 동적 메모리를 할당받는 모습

 

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

static int serialNum;
  • 인스턴스가 생성될 때 만들어지는 변수(일반 멤버 변수)가 아닌, 처음 프로그램이 메모리에 로딩될 때 메모리를 할당
  • 클래스 변수, 정적변수라고도 함 (vs. 인스턴스 변수)
  • 인스턴스 생성과 상관 없이 사용 가능하므로 클래스 이름으로 직접 참조
프로그램이 메모리에 올라가면 프로세스가 된다.

프로세스가 스레드의 상태로 실행되게 되는데,

프로그램은 데이터/코드 영역으로 분리된다. 

코드 영역에 들어가는 것은 명령어 집합->라인대로 실행

데이터 영역에 들어가는 것은 처음부터 메모리를 잡는것들 (상수/리터럴/Static)

인스턴스가 heap에 생성되었다가 사라지면 가비지콜렉터가 그 메모리를 회수

하지만 static같은 변수들은 프로그램들이 메모리에서 unload될 때 없어진다.

 

3. static 변수 테스트하기(1)

회사에 사원이 들어오면 사번을 차례대로 부여할 것이다!

우선 인스턴스가 만들어질 때마다 사번을 하나씩 증가시켜보자.

 

Employee.java

package ch16;

public class Employee {
	
	public static int serialNum=1000;
	
	private int employeeId;
	private String employeeName;
	private String department;
	
//속성 변수를 private로 만들고, get/set으로 변수 오용되는 것 막기! 
	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;
	}
}

EmployeeTest.java

package ch16;

public class EmployeeTest {

	public static void main(String[] args) {
		
		Employee employeeLee =new Employee(); //(생성자를 안만들어줬지만 기본생성자가 있으니까) new해서 인스턴스 만들기!
		employeeLee.setEmployeeName("이순신");
		
		System.out.println(employeeLee.serialNum);
		
		Employee employeeKim =new Employee();
		employeeKim.setEmployeeName("김유신");
		employeeKim.serialNum++;
		
		System.out.println(employeeLee.serialNum);
		System.out.println(employeeKim.serialNum);
	}
}

결과

static 변수는 공유된다~!

--> static 변수는 인스턴스에서 공통으로 사용하는 영역이다!

 

 

3. static 변수 테스트하기(2)

회사원이 입사할 때마다(새로운 인스턴스를 만들때마다) 새로운 사번 부여!(생성자에다가 static변수++)

Employee.java

package ch16;

public class Employee {
	
	public static int serialNum=1000;
	
	private int employeeId;
	private String employeeName;
	private String department;
	
	public Employee(){
		serialNum++;
		employeeId=serialNum;
	}
	
//속성 변수를 private로 만들고, get/set으로 변수 오용되는 것 막기! 
	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;
	}
}

EmployeeTest.java

package ch16;

public class EmployeeTest {

	public static void main(String[] args) {
		
		Employee employeeLee =new Employee(); //(생성자를 안만들어줬지만 기본생성자가 있으니까) new해서 인스턴스 만들기!
		employeeLee.setEmployeeName("이순신");
		
		Employee employeeKim =new Employee();
		employeeKim.setEmployeeName("김유신");
		
		System.out.println(employeeLee.getEmployeeName() + "," + employeeLee.getEmployeeId());
		System.out.println(employeeKim.getEmployeeName() + "," + employeeKim.getEmployeeId());
	}
}

결과


4. static 변수와 메서드는 인스턴스 변수, 메서드가 아니므로 클래스 이름으로 직접 참조

 

System.out.println(Employee.serialNum);
//serialNum은 인스턴스가 생기기 전에 이미 만들어졌으므로, 인스턴스로 참조(employeeLee.serialNum); 말고
//클래스 이름으로 직접 참조해도 된다

 

 

참고하기 좋은 블로그

https://mangkyu.tistory.com/47?category=872426 

 

[Java] static변수와 static 메소드

1. Static 정리 Java에서 Static 키워드를 사용한다는 것은 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미합니다. 이를 정확히 이해하기 위해서는 메모리 영역에 대한 이해가 필

mangkyu.tistory.com

 

profile

Burninghering's Blog

@개발자 김혜린

안녕하세요! 반갑습니다.