[Java]静的変数とメソッド


1.静的変数と静的メソッドは何ですか。


一般的なメンバー変数またはメソッドは、クラスのコンストラクション関数を呼び出すとき(すなわち、インスタンスを作成するとき)hip領域にメモリを割り当てます.ただし、静的変数は、インスタンスが作成されていない場合にも、メモリを個別のデータ領域に割り当てます.
各クラスには1つの静的変数に関するメモリしか割り当てられないため、各インスタンスは同じ静的値を共有します.
静的メソッドは、静的変数と同様にメモリを割り当てます.
したがって、静的変数および静的メソッドは、インスタンスを作成することなくクラス名で呼び出すことができる.StudentというクラスにSerialNumという共通の静的変数がある場合は、Studentクラス以外で次のように使用できます.
System.out.println(Student.serialNum);
Student student1 = new Student();
Student student2 = new Student();

System.out.println(student1.serialNum + " " + student2.serialNum);

// 출력결과는 셋 모두가 같은 값이 나온다!
また、getSerialNumという共通の静的メソッドがある場合は、Studentクラス以外で次のメソッドを使用できます.
Student student1 = new Student(); // 생략 가능!
System.out.println(Student.getSerialNum);
したがって,静的変数と静的メソッドを一般クラスのメンバー変数とメソッドと区別するためにクラス変数とクラスメソッドとも呼ばれる.これと対照的に、一般的なメンバー変数およびメソッドをインスタンス変数、インスタンスメソッドと呼ぶ.

2.静的変数の利用方法どうして書くの?


前述したように、静的変数が宣言されると、すべてのインスタンスが割り当てられたメモリを共有し、静的変数に対して同じ値を有します.名前の通り、クラス変数は、各インスタンスの変数ではなく、「クラス」の変数です.-
同じ値があるのに、クラス変数を使用しなければならないのはなぜですか?
次のコードは、インスタンスを作成する順序で学生に学号(インスタンス変数)を指定させるために作成されたコードです.
package staticex;

public class Student1 {
	public static int serialNum = 1000; // static 변수
	public int studentID;				// 인스턴스변수 학번은 따로 있음
	public String studentName;
	public int grade;
	public String address;
	
	public Student1() {
		serialNum++;
		studentID = serialNum; 
        // 생성자에 이런식으로 클래스 변수를 사용하면 구현할 수 있겠구나~!
	}
	
	public String getStudentName() {
		return studentName;
	}
	
	public void setStudentName (String name){
		studentName = name;
	}
}
package staticex;

public class StudentTest2 {
	public static void main (String args[]) {
		Student1 studentLee = new Student1();
		studentLee.setStudentName("이지원");
		System.out.println(Student1.serialNum);
		System.out.println(studentLee.studentName +" /학번: "+studentLee.studentID);
		
		Student1 studentSon = new Student1();
		studentSon.setStudentName("손수경");
		System.out.println(Student1.serialNum);
		System.out.println(studentSon.studentName + " /학번: "+studentSon.studentID);
	}
}
<出力結果>
1001
이지원 /학번: 1001
1002
손수경 /학번: 1002
前述したように、静的変数をうまく利用すれば、main関数で符号化演算を行う必要はありません.インスタンスの生成時に直ちにシーケンス番号が付与され、コードが簡潔になるからです.

3.クラスメソッド、変数およびインスタンスメソッド、およびそれらの関係


では、クラスメソッド、変数、インスタンスメソッド、およびそれらの関係について説明します.無理に暗記しない限り、よく考えれば簡単です.
まず、クラスメソッドでクラス変数を使用できます.これは、両方が同じメモリ領域に割り当てられ、作成および破棄される時点も一致するためです.
クラスメソッドでインスタンス変数を使用してもよろしいですか?いいえ.これは、インスタンス変数がインスタンスを作成してからストレージ領域を割り当てる必要があり、クラスメソッドがインスタンスを作成する前にメモリを割り当てているため、まだ存在しない変数を使用したい場合があります.間違いは避けられない.
インスタンスメソッドでは、クラス変数とインスタンス変数を使用できます.クラス変数はインスタンス変数の前にメモリ(存在)を割り当て、インスタンス変数はインスタンスメソッドでメモリを割り当てながらメモリを割り当てるためです.

また、クラス名を使用してクラス変数とメソッドを呼び出すことをお勧めします.インスタンス名を使用してクラス変数とメソッドを呼び出すこともできますが、JVMでは推奨されません.クラス名でインスタンス変数とインスタンスメソッドを呼び出すことはもちろん不可能です(各インスタンスには異なる値があるため)、インスタンス名でインスタンス変数とメソッドを呼び出すことはもちろん可能です.