안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.
☞ 인스턴스(멤버) 변수의 초기화 순서 (객체 생성)
① 타입 별 초기값 세팅
② 명시적 초기값 대입
③ 초기화 블럭에서 대입한 값
④ 생성자에서 대입한 값
우선순위
(낮음) 초기값 → 명시적 초기값 → 초기화 블럭 → 생성자 (높음)
인스턴스 필드의 초기화
객체가 만들어지는 시점에서 이루어집니다.
객체가 생성자에서 만들어지므로, 생성자 내에서 인스턴스 필드를 초기화 하는 것이 일반적!
초기값
public class Sample {
//기본 초기값(인스턴스 변수)
int a;
}
public class SampleMain {
public static void main(String[] args) {
Sample sam = new Sample();
System.out.println("객체 생성 완료 : " + sam.a);
}
}
@콘솔출력값
객체 생성 완료 : 0
Sample 객체 생성 후 a를 출력해보니, int형의 기본 값인 0이 출력 되는 것 알 수 있습니다.
명시적 초기화
public class Sample {
//명시적 초기화
int a = 100;
}
public class SampleMain {
public static void main(String[] args) {
Sample sam = new Sample();
System.out.println("객체 생성 완료 : " + sam.a);
}
}
@콘솔출력값
객체 생성 완료 : 100
초기화 블럭
public class Sample {
int a = 100;
//초기화 블럭
{
System.out.println("초기화 블럭 전 : " + a);
a = 200;
System.out.println("초기화 블럭 후 : " + a);
}
}
public class SampleMain {
public static void main(String[] args) {
Sample sam = new Sample();
System.out.println("객체 생성 완료 : " + sam.a);
}
}
@콘솔출력값
초기화 블럭 전 : 100
초기화 블럭 후 : 200
객체 생성 완료 : 200
생성자
public class Sample {
int a = 100;
//초기화 블럭
{
System.out.println("초기화 블럭 전 : " + a);
a = 200;
System.out.println("초기화 블럭 후 : " + a);
}
//생성자
public Sample() {
System.out.println("생성자 전 : " + a);
a = 300;
System.out.println("생성자 후 : " + a);
}
}
public class SampleMain {
public static void main(String[] args) {
Sample sam = new Sample();
System.out.println("객체 생성 완료 : " + sam.a);
}
}
@콘솔출력값
초기화 블럭 전 : 100
초기화 블럭 후 : 200
생성자 전 : 200
생성자 후 : 300
객체 생성 완료 : 300
☞ 클래스(static) 변수의 초기화 순서 (클래스 최초 사용 시)
① 타입 별 초기값 세팅
② 명시적 초기값 대입
③ 초기화 블럭에서 대입한 값
우선순위
(낮음) 초기값 → 명시적 초기값 → 초기화 블럭 (높음)
static 필드 초기화
객체 생성 이전에도 사용할 수 있어야 하므로 생성자가 호출되지 않은 상태에서도 초기화할 수 있어야 합니다.
생성자에서는 정적 필드를 초기화할 수 없음!
초기값
public class Sample {
//클래스 변수
static int b;
}
public class SampleMain {
public static void main(String[] args) {
Sample sam = new Sample();
System.out.println("static 변수 확인 : " + Sample.b);
}
}
@콘솔출력값
static 변수 확인 : 0
명시적 초기화
public class Sample {
//클래스 변수
static int b;
}
public class SampleMain {
public static void main(String[] args) {
Sample sam = new Sample();
System.out.println("static 변수 확인 : " + Sample.b);
}
}
@콘솔출력값
static 변수 확인 : 99
초기화 블럭
클래스가 로딩될 때 static block이 실행!!!
public class Sample {
//클래스 변수
static int b = 99;
static {
System.out.println("static 초기화 블럭 전 : " + b);
b = 999;
System.out.println("static 초기화 블럭 후 : " + b);
}
}
public class SampleMain {
public static void main(String[] args) {
Sample sam = new Sample();
System.out.println("static 변수 확인 : " + Sample.b);
}
}
@콘솔출력값
static 초기화 블럭 전 : 99
static 초기화 블럭 후 : 999
static 변수 확인 : 999
클래스가 로딩될 때 static 초기화 블럭이 실행 되는 것을 확인할 수 있습니다.
public class Sample {
//클래스 변수
static int b;
static {
b = 999;
System.out.println("클래스 로딩!");
}
}
public class SampleMain {
public static void main(String[] args) {
Sample sam = new Sample();
System.out.println("static 변수 확인 : " + Sample.b);
}
}
@콘솔출력값
클래스 로딩!
static 변수 확인 : 999
클래스 로딩! 이 먼저 출력된 것을 확인할 수 있습니다.
따라서 복잡한 값 세팅이 있다면 static 초기화 블럭 안에서 수행하고 값 대입 하는 것이 좋겠죠?
'Java > Java' 카테고리의 다른 글
메소드) 인스턴스 메소드, static 메소드 (0) | 2022.03.17 |
---|---|
접근 제한자) 멤버 및 생성자의 접근 제한자, 클래스의 접근 제한자 (0) | 2022.03.16 |
변수) 변수 별 생명 주기 Liftcycle (0) | 2022.03.16 |
변수) 전역변수(인스턴스 변수, static 변수), 지역변수 (0) | 2022.03.16 |
객체 지향 3대 원칙) 캡슐화에 대해서, this. (0) | 2022.03.15 |