static 변수
- 클래스 하나에서 생성되는 여러개의 인스턴스가 하나의 값을 공유할 필요가 있을 때 사용하는 변수로 하나의 변수
- 인스턴스가 힙메모리에 생성되는 것과는 다르게 다음 그림과 같이 데이터 영역 메모리에 생성되며 인스턴스의 생성과 상관없이 사용할 수 있습니다.
- 클래스 이름으로 참조되며 Student 클래스에 serialNum이라는 스태틱 변수를 참조한다면 Student.serialNum으로 사용할 수 있습니다.
예제, Student클래스에 학생 인스턴스가 새로 생성될 때 마다 Student ID를 부여하시오
public class Student {
//1번
private static int serialNum = 1000;
private int studentID;
public String studentName;
//2번
public Student(String name) {
studentName = name;
serialNum++;
studentID = serialNum;
}
//3번
public int getStudentID() {
return studentID;
}
public static int getSerialNum() {
return serialNum;
}
}
- 1번 : 인스턴스가 생성될 때 마다 Student ID를 부여하기 위해서는 기준점이 되는 하나의 값이 필요한데 그것을 static변수로 선언하기 위해 serialNum 변수를 선언하고 초기값을 1000 대입합니다.
- 2번 : 인스턴스가 생성될 때마다 serialNum이 1씩증가해야 하기 때문에 2개의 Student생성자에 serialNum++을 해줍니다. 그리고 증가된 serailNum을 생성된 인스턴스의 StudentID 값의 대입해줍니다.
- 3번 : prviate으로 선언한 studentID와 serialNum을 읽기위한 get메서드를 각각 작성해주되 SerailNum은 static변수이니 static 메서드로 작성합니다.
public class StudentIdTest {
public static void main(String[] args) {
//1번
Student studentLee = new Student("Lee");
System.out.println(Student.getSerialNum());//1001
Student studentSon = new Student("Son");
System.out.println(Student.getSerialNum());//1002
//2번
System.out.println(studentSon.getStudentID());//1002
System.out.println(studentLee.getStudentID());//1001
}
- 1번 : 테스트 하기 위해 Student 인스턴스를 2개만들고 static 변수인 serialNum을 출력하기 위해 클래스명.메서드를 사용하여 출력하였더니 인스턴스가 생성될 때 마다 serailNum이 증가하는 것을 확인 할 수 있었습니다.
- 2번: studentId를 출력해 보았더니 인스턴스가 생성될때마다 증가된 seriaNum이 잘 대입된 것을 확인할 수 있습니다.
- 예제의 static변수인 serialNum과 참조변수, 각 인스턴스의 관계는 위의 그림과 같습니다. 그리고 증가된 serailNum이 대입되는 studentID변수는 각각의 인스턴스에 담기게 됩니다.
static 메서드
- static 변수를 위한 기능을 제공하는 메서드로 static메서드와 마찬가지로 클래스명.으로 참조해서 사용합니다.
public static int getSerialNum() {
int i = 0; // 지역변수는 사용가능
studentName = "Lee"; //에러 - 멤버변수는 사용불가
return serialNum;
}
- 위의 예제와 같이 static 메서드안에서 int i =0과 같은 지역변수는 함수안에서만 사용하고 소멸되는 변수이기에 사용가능합니다. 하지만 studentName같은 멤버변수는 사용할 수 없는데 그 이유는 static메서드는 인스턴스의 생성여부와 상관없이 사용할수 있는 메서드이지만 멤버변수는 인스턴스의 생성이 필수이기 때문입니다. static메서드를 사용하는 순간에 인스턴스가 없다면 오류가 날수 밖에 없는 변수이기 때문에 사용이 불가능합니다.
프로그램에서 변수의 유형
- 변수유형 별 어디에서 어떤 변수를 사용해야 하는지를 배워야 메모리 사용을 최적화 하고 에러를 줄이는 프로그래밍을 할 수 있기에 잘 이해해야 합니다.
'Java' 카테고리의 다른 글
[Java] 클래스와 객체 - 예제3 (0) | 2020.07.13 |
---|---|
[Java] 클래스와 객체 - static 응용 - singleton Pattern (0) | 2020.07.13 |
[Java] 클래스와 객체 - 예제2 (0) | 2020.07.12 |
[Java] 클래스와 객체 - 객체간 협력 (0) | 2020.07.10 |
[Java] 클래스와 객체 - this에 대하여 (0) | 2020.07.10 |