[Java] Static variable

SeongWon Oh·2021년 8월 14일
0

Java

목록 보기
11/39
post-thumbnail

Static변수

  • 회사에서 사원이 입사할 때마다 발급하는 사원번호, 학생의 학번 생성 등 여러개의 인스턴스에서 공유하는 변수가 필요한 경우에는 Static변수를 사용한다.

  • Static변수는 인스턴스의 생성과 상관없이 사용이 가능하므로 인스턴스가 아닌 클래스의 이름으로 직접 참조한다.

// serialNum은 static변수!

Student student1 = new Student();
student1.serial = 100; 
// (X) 이렇게 인스턴스 이름을 사용해 참조하지 않고 아래와 같이 class이름으로 참조한다.

Student.serialNum = 100; // (O)
  • Static변수는 다른 멤버 변수와는 다르게 인스턴스가 생성될 때 만들어지는 변수가 아니라 프로그램이 처음 로딩될 때 메모리에 할당되며 생성된다. 그래서 인스턴스를 생성하지 않고서도 Class이름을 사용하여 static변수를 불러올 수 있다.
  • static변수는 인스턴스가 생성되지 않아도 이미 메모리를 잡아둔 상태라 사용가능하다. 인스턴스가 생성전에 인스턴스 데이터를 할당하는건 잘못되었기에 static 메서드 내부에서 인스턴스 변수를 사용할 수 없다.
  • 하지만 반대로 다른 함수들에서 static값 변경은 가능하다.
	public static int getSerialNum() {
		employeeName = "Lee"; // 이렇게 인스턴스 변수 사용이 안됨 (오류가 발생함)
		return serialNum;
	}

👨🏻‍💻 Example Code

Employee.java

package ch17;

public class Employee {

	private static int serialNum = 1000;
	
	private int employeeId;
	private String employeeName;
	private String department;
	
	public Employee() {
		serialNum++;
		employeeId = serialNum;
	}
	
	public static int getSerialNum() {	 
		return serialNum;
	}
	
	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 ch17;

public class EmployeeTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Employee employee1 = new Employee();
		employee1.setEmployeeName("이순신");
		
		System.out.println(Employee.getSerialNum());
		
		Employee employee2 = new Employee();
		employee2.setEmployeeName("김유신");

		System.out.println(employee1.getEmployeeName() + "님의 사번은 " + employee1.getEmployeeId());
		System.out.println(employee2.getEmployeeName() + "님의 사번은 " + employee2.getEmployeeId());
	}

}

변수들의 메모리 저장 공간과 유효 범위

  • 멤버 변수가 너무 많으면 인스턴스를 생성할 때 쓸데없는 메모리가 많이 할당되어 좋은 프로그램이 아니다. 그래서 멤버 변수는 class의 속성이 될 수 있는 것들로만 적당히 사용하는게 좋다.

  • 클래스 내부의 여러 메서드에서 사용하는 변수는 멤버 변수로 선언하는 것이 좋다.

  • Static변수는 프로그램이 메모리에 로드될 때부터 데이터 공간을 잡아둬서 배열과 같이 큰 메모리를 잡는 것은 좋지 않다.



Reference

  • [Fast Campas] 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online.
profile
블로그 이전했습니다. -> https://seongwon.dev/

0개의 댓글