초기화 블록 순서
static //클래스 초기화 블록
{
System.out.println("static{ }");
}
//해당 클래스가 메모리에 한 번 실행될 때 딱 한 번 실행됨
{ //인스턴스 초기화 블록
System.out.println("{ }");
} //인스턴스 객체가 생성 되면서 클래스 초기화 되고 얘가 오고 생성자가 그 다음 온다.
Sample1027() //생성자
{
System.out.println("Sample1027 생성자");
}
static{ ... }
클래스 초기화 블록
클래스가 메모리에 올라갈 때 딱 한 번만 실행이 된다. 그러니 클래스 초기화 블록 static{ } 이게 가장 첫번째에 출력이 단 한 번 됨
{ }
인스턴스 초기화 블록
객체 생성 시 메모리를 할당 받고 나서 생성자가 호출된다. 그러니 생성자 호출 다음에 온다.
Sample1027(){ }
생성자
그렇다면 생성자는 가장 마지막으로 찍히게 되는 것임
public static void main(String[] args) {
System.out.println("Sample1027 m1 = new Sample1027();");
Sample1027 m1 = new Sample1027();
System.out.println("Sample1027 m2 = new Sample1027();");
Sample1027 m2 = new Sample1027();
//실행 순서 결과 확인
}
}
static{ } Sample1027 m1 = new Sample1027(); { } Sample1027 생성자 Sample1027 m2 = new Sample1027(); { } Sample1027 생성자 |
생성자 구현을 안 했을 때 인스턴스 블록에서 구현을 할 수 있다.
잘 쓰지는 않지만 문법적으로 필요할 때가 있음
class Pro
{
static int count = 0;
//클래스 변수 Pro당 하나만 생성
//Pro가 10개 생기면 얘는 한 개
int serialNo;
//인스턴스 변수
//얘는 10개
//객체 생성을 할 때마다 따로따로 생기는거다
{
++count;
serialNo = count;
}
Pro()
{
}
}
static int count = 0; 은 클래스 변수로 Pro 클래스 하나 당 하나만 생성이 되는 것이다. 객체 생성을 할 때마다 인스턴스 변수의 경우 생성한 개수만큼 생기지만 클래스 변수는 하나만 생기니까 같은 주소를 공유하고 있음. 때문에 count가 올라갈 때마다 초기화 되는 것이 아니라 쌓이게 되는 것이고, 누적값인 이유로 초기화 변수를 할 때 =0을 넣어주는 것이다.
int serialNo;는 인스턴스 변수로 객체 생성을 할 때마다 생성한 개수 만큼 생기게 되는 것이다.
public static void main(String[] args) {
Pro p1 = new Pro();
Pro p2 = new Pro();
Pro p3 = new Pro();
//Pro 구조는 똑같
System.out.println("p1 번호는 " + p1.serialNo);
System.out.println("p2 번호는 " + p2.serialNo);
System.out.println("p3 번호는 " + p3.serialNo);
System.out.println("총 개수는? " + Pro.count);
}
}
p1 번호는 1 p2 번호는 2 p3 번호는 3 총 개수는? 3 |
메인에서 객체 생성을 3번 하고 p1, p2, p3 count마다 누적이 돼서 숫자가 올라간다. 그리고 count의 값이 serialNo에 대입이 되기 때문에 시리얼 넘버도 바뀌는 것이다.
만약!!
count 변수가 클래스 변수가 아니라 인스턴스 변수 였다면?
객체 생성을 할 때마다 값이 초기화가 되기 때문에 모든 시리얼 넘버와 총 개수가 1로 출력이 된다.
'개발일지 > Java + Spring' 카테고리의 다른 글
211027 Java - 클래스 상속 후 부모 생성자 호출 (4) (0) | 2021.10.27 |
---|---|
211027 Java - 상속과 오버라이딩, 상속 받고 생성자 호출 방법(3) (0) | 2021.10.27 |
211027 Java - 생성자를 통한 인스턴스 복사 (1) (0) | 2021.10.27 |
메소드 오버로딩 (0) | 2021.10.26 |
클래스 - 참조형 반환타입, 같은 클래스 내 클래스/인스턴스 메소드 (0) | 2021.10.26 |