여러 인스턴스가 하나의 값을 공유할 필요가 있음
static 변수 <- 인스턴스 1, 인스턴스 2, 인스턴스 3 모두 하나의 값을 사용해서 호출하는 값들이 같은 값을 사용
static 변수는 처음 프로그램이 로드 될 때 데이터 영역에 생성 됨.(new로 생성자를 만들 때 생기는게 아님.)
인스턴스의 생성과 상관없이 사용할 수 있으므로 클래스 이름으로 참조가능
예를 들면, Student.serialNum = 100; 이렇게 사용 가능
클래스 변수, 정적 변수라고도 함.
이렇게 1000으로 static변수를 선언했을 때, 실제로 생성자를 호출할 때 serialNum++; 을 해서 확인을 할 수 있는데, 이를 통해 새로 생기는 값인지 아니면 공유되는 값인지 확인하기 위해 테스트 해보면,
이런식으로, 테스트를 해보면
이렇게 기본값으로 설정해둔 1000에서프로그램 실행을 통해 1001, 1002가 된것을 확인할 수 있는데 같은 메모리를 바라본다는 것을 알 수 있다.
앞서 말했듯이, static 변수는 인스턴스의 생성과는 상관이 없는데, 단순히 '클래스명.static변수명' 이렇게 호출할 수 있다.
이런 특징 때문에, 클래스 변수라고 한다.
- static 병수를 위한 기능을 제공하는 static 메소드
- static 메서드에서는 인스턴스 변수를 사용할 수 없음
- 클래스 이름으로 참조하여 사용하는 메서드
Student.getSerialNum();
- 클래스 메서드, 정적 메서드라고도 한다.
public static int getSerialNum() {
int i = 0;
studentName = "lee";
return serialNum;
}
보통은 스태틱 변수를 아무데서나 호출해서 공유되는 값을 바꿀 수 없게 하기 위해 private이라고 변수를 선언하고 public으로 메소드를 빼는데, 앞서 말했듯이 static은 인스턴스가 생성될 때(new) 생기는 변수가 아니므로, static 메소드 안에서 변수 메모리는 호출할 수 없음. 위 코드를 보면 studentName = "lee"; 이렇게 선언되어 있는 부분은 틀린 부분이다.
반대로 static 변수는 일반 메소드에서 사용할 수 있다. 인스턴스 생성과는 별개로 존재하기 때문.
자바 객체지향 프로그래밍 - 10 [매서드 오버라이딩] (0) | 2023.01.10 |
---|---|
자바 객체지향 프로그래밍 - 9 [singleton pattern] (0) | 2022.12.23 |
자바 객체지향 프로그래밍 - 7 [this] (0) | 2022.12.23 |
자바 객체지향 프로그래밍 - 6 [정보 은닉] (0) | 2022.12.17 |
자바 객체지향 프로그래밍 - 5 [참조 자료] (0) | 2022.12.14 |