public class Lotto {
private int[] nums;
private int size;
public Lotto() {
size=6; //6은 항상 똑같음 변하지 않음.. -> 매번만들어야하나? -> 전역변수로ㄱㄱ
nums = new int[6];
}
public static int getNum(Lotto lotto, int i) {
return lotto.nums[i];
}
...
}
Lotto라는 클래스가 있다.
그 안에는 로또 당첨 번호를 갖는 nums라는 배열이 있고,
그 배열의 크기를 갖는 size라는 변수가 있다.
Lotto 클래스의 생성자에서는 size를 6으로 초기화 해주고 있다.
하지만 생각해보면 로또당첨번호 개수인 6은 항상 똑같다. 변하지 않는다.
그런데도 매번 만들어야 하는 것이 번거롭다.
또한 size는 인스턴스 변수이므로 객체가 생성될 때마다 메모리에 개별적으로 공간을 갖게 된다.
이를 해결하기 위해 size변수를 static으로 바꾸었다.
public class Lotto {
private int[] nums;
public static int size;
public Lotto() {
size=6;
nums = new int[6];
}
public static int getNum(Lotto lotto, int i) {
return lotto.nums[i];
}
...
}
static이 붙은 size변수는 전역변수가 되었다.
전역변수는 인스턴스화와 상관이 없다.
static은 무조건 제일 먼저(main보다도 먼저) 실행되므로 메모리에 미리 올라가있다.
따라서 인스턴스화 없이 접근가능하다.
전역변수이므로 100개의 객체가 만들어져도 하나의 공간가지며 모든 객체가 같이 쓴다.
여기서 또 한가지 의문점은 전역변수인 size를 객체가 생성될때마다 생성자를 통해 초기화 시키고 있다는 것이다.
size는 어차피 하나이며 모든 객체가 같이 쓰는 건데 매번 초기화 할 필요가 없다.
이를 해결하는 방법은 static 생성자이다.
public class Lotto {
private int[] nums;
public static int size;
static {
size = 6;
}
public Lotto() {
nums = new int[6];
}
public static int getNum(Lotto lotto, int i) {
return lotto.nums[i];
}
static 생성자는 static 붙은 애들을 초기화 할 수 있는 영역이다.
이렇게 하면 매번 초기화되지 않고 맨 처음 한번만 초기화 하게 된다.
정리하자면
- 인스턴스변수 -> 인스턴스화할때마다 생성됨(메모리에 개별적으로 공간가짐)
- 전역변수 ->인스턴스화와 상관없음. 메모리에 미리 올라가있음. 인스턴스화 없이 접근가능. 100개의 객체가 만들어져도 하나의 공간가짐. 모든 객체가 하나로 같이 씀
- static 생성자 -> static 변수를 초기화하는 생성자. 제일 먼저, 한번 실행됨.
- class 생성자 -> 객체가 만들어질때 마다 실행됨