멤버 초기화
초기화
스태틱 변수와 인스턴스 변수는 초기화하지 않아도 기본값이 존재
0 혹은 0에 준하는 값, 참조형이라면 null
지역변수는 초기화하지 않으면 사용할 수 없음
초기화 방법 : 명시적 초기화, 생성자, 초기화 블록(인스턴스, 클래스)
초기화 블럭은 스태틱 초기화 블럭과 인스턴스 초기화 블럭이 있다. 이들은 클래스 내에 선언되며 각각 static {}, {} 로 작성한다 전에 실행
static 초기화블럭
기능 : 클래스 변수의 초기화
실행 시점 : 클래스 정보 로드시 한번 실행. main 메서드보다 이전에 실행.
인스턴스 초기화블럭
기능 : 인스턴스변수의 초기화. 생성자와 기능의 겹침
실행 시점 : 객체화시마다 생성자 호출 전에 실행
멤버 변수 초기화 순서
시점
스태틱 변수 - 클래스가 로딩될 때 딱 한번 초기화
인스턴스 변수 - 인스턴스가 생성될 때마다 각 인스턴스 별로 초기화
순서
스태틱변수 - 기본값 → 명시적 초기화 → 클래스 초기화 블럭
인스턴스 변수 - 기본값 → 명시적 초기화 → 인스턴스 초기화 블럭 → 생성자
public class InitEx1 {
static int cv;
int iv;
InitEx1(){
System.out.println("5.생성자 호출됨");
}
static { //static 초기화 블럭 > main보다 먼저 실행된다. 처음 딱 한번만 실행된다.
cv = (int)(Math.random()*100);
System.out.println("1.static 초기화 블럭 실행. cv = "+cv);
}
{ //인스턴스 초기화 블럭 > 대체로 따로 작성하지 않고 생성자 내부에 쓴다. 객체 생성때마다 호출됨.
iv = (int)(Math.random()*100);
System.out.println("4. 인스턴스 초기화 블럭 실행. iv = "+iv);
}
public static void main(String[] args) {
System.out.println("2.main 메서드 시작");
System.out.println("3.main 메서드에서 init1 객체 생성 cv = "+cv);
InitEx1 init1 = new InitEx1();
System.out.println("3.main 메서드에서 init2 객체 생성 cv = "+cv);
InitEx1 init2 = new InitEx1();
System.out.println("6.main 메서드 종료");
}
}
출력 :
1.static 초기화 블럭 실행. cv = 15
2.main 메서드 시작
3.main 메서드에서 init1 객체 생성 cv = 15
4. 인스턴스 초기화 블럭 실행. iv = 7
5.생성자 호출됨
3.main 메서드에서 init2 객체 생성 cv = 15
4. 인스턴스 초기화 블럭 실행. iv = 70
5.생성자 호출됨
6.main 메서드 종료
'JAVA > 개념' 카테고리의 다른 글
JAVA :: super 예약어 (0) | 2024.03.28 |
---|---|
JAVA :: 상속 (0) | 2024.03.28 |
JAVA :: this() 생성자, this 참조변수 (2) | 2024.03.28 |
JAVA :: 생성자 용도와 사용법 (0) | 2024.03.28 |
JAVA :: printf 출력서식 - %d, %f, %c, %s (0) | 2024.03.26 |