Static 변수
멤버변수 = 인스턴스 변수가 있으면
여러 인스턴스가 하나의 값을 공유할 필요가 있다.
공유메모리가 필요할 때 프로그램 전체에서 접근해서 쓸수있다.
Class 에서는 외부에서 변수를 두고 쓸수없고 클래스안에 들어갈수있다
그중 static 변수는 여러 인스턴스가 그 값을 공유할수있다.
Static 변수는 데이터영역(static영역) 메모리에 잡히게 된다. ( 힙메모리가 아니다 )
각각 인스턴스들이 가리키는 변수값은 하나의 메모리 동일하다.
단 한번만 메모리에 잡히고 모든 인스턴스가 공유한다.
인스턴스의 생성과 상관없이 사용할수 있으므로 클래스 이름으로 참조한다.
Student.serialNum = 100; 클래스변수 , 정적 변수 라고 한다
지역안에서 선언된 참조변수는 스택메모리에 잡히게 될것이고 실질적으로 가리키는 메모리는 힙메모리 인스턴스에 잡힌다.
Static은 같이 공유하고있는 데이터영역에 바라보고 있는 것이다.
Static 메소드
Static 변수를 위한 기능을 제공하는 static 메소드
Static 메소드에서는 인스턴스 변수를 사용할수 없다
클래스 이름으로 참조 한다.
package staticex;
// 학생이 생성될때마다 학생의 아이디를 새로 부여해주고 싶을때 기준값이 있어야 하는데 기준값이 점점증가해야됨
// 기준이 되는값을 모든 인스턴스가 같은곳을 즉 하나의메모리 static메모리를 바라봐야 한다.
public class Student {
// public static int serialNum = 1000; // static 메모리에 저장 , 원하는 기준값을 만들려면 private 으로 만드는게 좋다
private static int serialNum = 1000; // private static 을 가져다쓰고싶으면 밑에 get , set 을 쓰면 된다.
private int studentID;
public String studentName;
public String address;
public Student(String studentName) {
this.studentName = studentName;
serialNum++; // 학생이 생성될때마다 학생의 아이디를 기준값에 새로 증가 해주고 싶을때
studentID = serialNum; // 매번 증가되는 serialnum이 각 인스턴스의 학번이 된다.
}
public Student(int studentID, String studentName) {
this.studentID = studentID;
this.studentName = studentName;
serialNum++; // 학생이 생성될때마다 학생의 아이디를 기준값에 새로 증가 해주고 싶을때
}
public void showInfoStudentInfo() {
System.out.println(studentName + "," + address );
}
public String getStudentName() {
return studentName;
}
public int getStudentID() {
return studentID;
}
// static 메소드가 생성됬다.
public static int getSerialNum() { // static변수를 사용하기 위해 static메소드를 썻다.
int i = 0; // 지역변수
// static 메소드 안에서 인스턴스 변수를 쓸수없다. ( 인스턴스 생성과 상관없이 호출될수있는데
이변수 값을 넣으려면 인스턴스 new해야지 생긱는 변수메모리니까
// studentName = "Lee";
return serialNum;
}
public static void setSerialNum(int serialNum) {
Student.serialNum = serialNum;
}
}
package staticex;
public class StudentIDTest {
public static void main(String[] args) {
Student studentLee = new Student("Lee");
// System.out.println(studentLee.serialNum); // 1001
//private으로 설정된 static은 get 으로 가져오면 된다.
System.out.println(studentLee.getSerialNum()); // 클래스메소드 = static 메소드 라고 부른다.
// 두개의 변수가 같은 메모리를 바라보고 있는 것을 알수있다.
Student studentKim = new Student("Kim");
// System.out.println(studentKim.serialNum); // 1002
// System.out.println(studentLee.serialNum); // 1002
// 각 Student가 생성될때마다 각각 다른 studentID를 자동생성해서 가져올수있다.
System.out.println(studentLee.getStudentID()); // 1001
System.out.println(studentKim.getStudentID()); // 1002
// static은 참조변수로 어세스하는게 아닌 클래스이름으로 참조한다.
// System.out.println(Student.serialNum);
// 인스턴스가 하나도 생성하지 않더라도 static 변수는 사용할수 있다.
// static 변수는 처음 프로그램 메모리에 로드될때 생성됬다가 프로그램 내려갈때 사라진다.
}
}
멤버변수 - 인스턴스 생성 될때 힙에 생성되고 가비지 컬렉터가 메모리를 수거 할때 소멸
static 변수 - 프로그램이 처음 시작할때 상수와 함께 데이터 영역에 생성되고 프로그램이 끝나고 메모리를 해제할때
소멸된다.
'JAVA Programming' 카테고리의 다른 글
[27] 다차원 배열 (0) | 2020.07.15 |
---|---|
[26] 객체 배열 (0) | 2020.07.14 |
[24] 배열이란 ? (2) (0) | 2020.07.14 |
[23] 배열 이란 ? (0) | 2020.07.14 |
[21] static 을 활용한 싱글톤 패턴 (0) | 2020.07.14 |