여러 개의 인스턴스가 같은 메모리의 값을 공유하기 위해 사용
인스턴스가 생성될 때마다 다른 메모리를 가지는 것이 아니라 프로그램이 메모리에 적재(load)될 때 데이터 영역의 메모리에 생성됨.
=>인스턴스의 생성과 관계없이 클래스 이름으로 직접 참조함
사용방법)
static 자료형 변수이름;
s tatic int a;
멤버변수는 생성할 때마다 각각의 메모리를 갖는다.
new로 인스턴스를 생성하여 james 또는 tomas로 참조변수로 하여 값을 받을 때 이 때의 값은 각각 다른 값을 받는다.
주의점) new 할 때 메모리 할당을 받으며 heap에 저장됨
static 정적변수는 값을 공유하여 같은 값을 가지게 할 때 사용한다.
인스턴스를 생성해도 james와 tomas의 값은 같다.
주의점) 전체 프로그램이 메모리에 로드될 때 할당을 받음
(상수, literal, static 등)
멤버변수 : 메소드 밖에서 선언된 변수
지역변수 : 메소드 안에서 선언된 변수
학번 기준점을 만들어 학생이 추가될 때마다 학번 생성하는 프로그램
-> 기준되는 숫자는 각각의 인스턴스에 값이 있을 경우 공통 기준점이 아니므로 static으로 선언.
public class Student {
static int serialNum = 10000;
int studentID;
String studentName;
}
public class StudentTest1 {
public static void main(String[] args) {
Student james = new Student();
System.out.println(james.serialNum); //10000
james.serialNum++;
Student tomas = new Student();
System.out.println(james.serialNum); //10001
System.out.println(tomas.serialNum); //10001
}
}
-> 위의 문제점은 static으로 같은 값을 공유하고 있어 james와 tomas와 학번이 같다.
public class Student {
static int serialNum = 10000;
int studentID;
String studentName;
public Student() {
serialNum++; //serialNum을 증가시킨 것을 studentID로 복사
studentID = serialNum;
}
}
public class StudentTest1 {
public static void main(String[] args) {
Student james = new Student();
System.out.println(james.studentID); //10001
Student tomas = new Student();
System.out.println(tomas.studentID); //10002
}
}
메서드를
public Student() {
serialNum++;
studentID = serialNum;
}로 하면 serialNum 증가 된 값을 studentID로 복사하여 객체에서 부르게 되면 증가되어 각각의 학생의 학번이 다르게 된다.
note)
serialNumber를 static으로 선언하면 모든 student instance에 대해 하나의 변수로 유지되고 이러한 변수를 class변수라고 한다.
메서드에 static 키워드를 사용하여 구현
주로 static변수를 위한 기능 제공
주의점)
static 메서드에서 인스턴스 변수를 사용할 수 없음
static 메서드도 인스턴스의 생성과 관계 없이 클래스 이름으로 직접 메서드 호출
ex)
student.getSerialNum(); //getSerialNum()이 staic 메서드
-인스턴스의 변수의 경우 꼭 인스턴스가 먼저 생성되어야 하므로 static 메서드에서는 생성이 불확실한 인스턴스 변수를 사용할 수 없음.
선언 위치 : 함수 내부에 선언
사용 범위 : 함수 내부에서만 사용
메모리 : 스택
생성과 소멸 : 함수가 호출될 때 생성되고 함수가 끝나면 소멸함
선언 위치 : 클래스 멤버 변수로 선언
사용 범위 : 클래스 내부에서 사용하고 private이 아니면 참조 변수로 다른 클래스에서 사용 가능
메모리 : 힙
생성과 소멸 : 인스턴스가 생성될 때 힙에 생성되고, 가비지 컬렉터가 메모리를 수거할 때 소멸됨
선언 위치 : static예약어를 사용하여 클래스 내부에 선언
사용 범위 : 클래스 내부에서 사용하고 private이 아니면 클래스 이름으로 다른 클래스에서 사용 가능
메모리 : data영역
생성과 소멸 : 프로그램이 처음 시작할 때 상수와 함께 데이터 영역에 생성되고 프로그램이 끝나고 메모리를 해제할 때 소멸됨