[Java] Static variable


せいてきへんすう


  • 従業員が入社するたびに発行される従業員番号、学生の学号など、複数のインスタンスで共有する変数が必要な場合は、Static変数を使用します.


  • Static変数は使用可能であるため、インスタンスではなくクラス名を直接参照します.
  • // serialNum은 static변수!
    
    Student student1 = new Student();
    student1.serial = 100; 
    // (X) 이렇게 인스턴스 이름을 사용해 참조하지 않고 아래와 같이 class이름으로 참조한다.
    
    Student.serialNum = 100; // (O)
  • 静的変数は、インスタンスの作成時に作成された変数ではなく、プログラムの最初のロード時にメモリに割り当てられ、作成された変数です.したがって、インスタンスを作成することなく、クラス名を使用して静的変数をロードできます.
  • 静的変数は、メモリがすでに存在するため、インスタンスを作成する必要がなく使用できます.インスタンスが生成プロセスにインスタンスデータを割り当てるのは間違っているため、インスタンス変数は静的メソッドでは使用できません.
  • ですが、逆に他の関数では静的値を変更できます.
  • 	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のプロパティとして適切に使用することが望ましい.

  • クラス内のさまざまなメソッドで使用される変数は、メンバー変数として宣言することが望ましい.

  • 静的変数は、プログラムがメモリにロードされるとデータ領域を占有するのではなく、配列などの大量のメモリを占有します.
  • Reference

  • 「Fast Campas」を一度に完了したJava/spring Web開発主ハイパーパケットオンライン.