ecsimsw

자바의 초기화 순서를 아시나요? 본문

자바의 초기화 순서를 아시나요?

JinHwan Kim 2020. 3. 31. 03:15

초기화

 

멤버 변수의 초기화는 선택적이지만, 지역 변수의 초기화는 필수적이다.

멤버 변수를 초기화 하는 방법에는 세가지가 있다. 

0. 기본값
1. 명시적 초기화
2. 생성자를 통한 초기화
3. 초기화 블록

 

0. 기본값

 

초기화에 앞서, 멤버 변수는 초기화가 선택적이기 때문에 초기화가 안됐다면 자료형 마다 기본 값을 갖는다. 

 

boolean = false
char = '\u000'
byte,short,int = 0
long = 0L
float = 0.0F
double = 0.0

참조형 변수 = null

 

1. 명시적 초기화 

가장 쉽게, 변수를 선언과 동시에 초기화하는 방식이다.

 

class Person{
   String name = "unkown";
   int age=0;
 }

 

2. 생성자를 통한 초기화

생성자를 이용하여 멤버 변수를 초기화한다.

 

class Person{
   String name;
   int age;
 
   Person(String name, int age){
      this.name = name;
      this.age = age;
   }
 }
 
 Person ecsimsw = new Person("jinhwan", 0); 

 

2-1. this

 

인스턴스 자신을 가리키는 참조 변수로, this.value로 인스턴스안의 변수를 가져오고, this()로 생성자를 호출한다.

 

class Person{
   String name;
   int age;
 
   Person(String name){
     this("unkown");
   }

   Person(String name){
      this(name, 0)

   Person(String name, int age){
      this.name = name;
      this.age = age;
   }
 }

 

위 예제에서, Person를 인스턴스할 때, name과 age를 모두 입력하면, name만 입력하면, 아무 것도 입력하지 않으면의 세가지 상황에서 어떤 인스턴스가 생성되는지를 생각해보면, this로 생성자를 짜는 것이 매우 효율적인 것을 볼 수 있을 것이다. 또, 지역 변수의 name과 인스턴스 변수 name을 구분하는 것으로 this를 사용한게 얼마나 가시적이고 효율적인지 볼 수 있다. 

 

 

3. 초기화 블록

 

초기화 블록은 클래스 멤버를 초기화하는 클래스 초기화 블록, 인스턴스 멤버를 초기화하는 인스턴스 초기화 블록으로 나눠진다. 방식은 아래와 같다.

class Person{
   static String name;
   int age;
   
   static {
   	 name = "unknown";
   }
   
   {
     age = 0;
   }
 }

 

클래스 멤버인 이름은 클래스 초기화 블록으로, 인스턴스 멤버인 나이는 인스턴스 초기화 블록으로 초기화 한다.

 

 

초기화 실행 시점

 

클래스가 메모리에 올라가면서, 클래스 변수는 기본값에서 명시적 초기화, 초기화 블록에 의한 초기화가 수행된다.

 

인스턴스 되면서, 인스턴스 멤버 역시 마찬가지로 기본 값에서 명시적 초기화, 초기화 블록에 의한 초기화가 수행되고, 그 후 생성자가 호출됨에 따라 생성자에 의한 초기화가 처리된다.

 

초기화 실행 시점

 

Comments