안녕하세요. 요즘 안드로이드를 공부하고 있는데 역시 자바에 대한 깊이의 부족함을 느끼곤 합니다.


이번에 제가 만난 코드는 static 초기화였습니다.



이게 어디에 있냐하면 클래스를 정의하는 멤버변수를 선언하는 곳에 있는겁니다. 

그래서 검색을 해보니 static 초기화라고 합니다.


그래서~!!


쇠뿔도 단김에 빼라고 자바의 대표적인 초기화 4가지를

포스팅하겠습니다.


제가 생각하는 자바에서의 초기화는 4가지가 있습니다. 지극히 주관적이고 아는게 4개 뿐입니다;; 더 아시는 분이 계시다면 댓글로 알려주세요

1. 아까도 말씀드린 staic 초기화

2. 인스턴스 초기화

3. 명백한 초기화

4. 생성자 초기화 

가 존재합니다.

일단 개념부터 말씀드린 뒤에 어디에 사용되는지 알려드리면서 각각의 초기화의 순서에 대하여 알아보겠습니다.

-개념-

1. static 초기화란 staic을 선언한뒤 블록 안에다가 값을 넣어 초기화 하는 기법입니다. 사실 초기화 말고도 다른 역활을 할 수 있습니다. 형식은 


2. 인스턴스 초기화란 staic이 없는 상황에서 블록으로 감싸 그안에 로직을 정의하는 것입니다.

3. 명백한 초기화란 다들 아시다시피 저글링이라는 클래스를 정의를 한다면 모든 저글링의 체력은 35이며 공격력과 방여력이 모두 일정합니다. 그렇다면 다른 값이 없으니 명백한 초기화

}

이런 형식이 되는것이죠.

4. 마지막으로 생성자 초기화는 다들 아시다 시피 생성자를 호출할 때 값을 넘겨 값에 따라 다르게 초기화를 하는 기법입니다.

대충 이런 형식입니다.


자 그러면 이들이 무엇이 다르냐 하는 것은 바로 실행 순서 입니다.


언제 실행되느냐 어떤 점이 좋으냐가 바로 중요한 점이죠.


3. 명백한 초기화와 4. 생성자 초기화는 대강 감이 잡히실 겁니다.

명백한 초기화는 초기화를 한번하면 그 객체를 몇번생성하든 초기화를 한번만 하면 된 다는 것이 장점이며

생성자 초기화는 객체에 따라 다른 상태를 주어서 객체마다 다른 특성을 나타내도록 할 수 있습니다.


그렇다면 1. static 초기화와 2. 인스턴스 초기화는 어떤 점이 다를가요? 

바로 실행 순서와 실행되는 조건입니다.

static 초기화 블록은 클래스 변수의 복잡한 초기화에 사용된다. 클래스가 처음 로딩될 때 한번만 수행된다.

인스턴스 초기화 블럭은 인스턴스 변수의 복잡한 초기화에 사용된다. 인스턴스가 생성될때 마다 수행된다. (생성자보다 먼저 수행된다.)


여기에 관해서는 


Powerful Programming 님의 블로그를 참조하였습니다.

http://warmz.tistory.com/50


인스턴스 변수의 초기화는 주로 생성자를 사용하기 때문에, 인스턴스 초기화 블럭은 잘 사용되지 않는다. 대신 클래스의 모든 생성자에서 공통적으로 수행되어져야 하는 코드가 있는 경우 생성자에 넣지 않고 인스턴스 초기화 블럭에 넣어 두면 코드의 중복을 줄일 수 있어서 좋다.

Car(){
    System.out.println("Car 인스턴스 생성");
    color="White";
    gearType="Auto";
}
Car(String color, String gearType){
    System.out.println("Car 인스턴스 생성");
    this.color = color;
    this.gearType=gearType;
// 인스턴스 블럭
{  System.out.println("Car인스턴스 생성");  }

Car(){
   color="White";
   gearType="Auto";
}
Car(String Color, String gearType){
   this.color=color;
   this.gearType=gearType;


이처럼 코드의 중복을 제거할 수 있다.


자 그렇다면 파일을 실행 했을 때 무엇이 먼저 실행되는 지를 살펴 보자.



결과 값

1. static { }

2. BlockTest bt = new BlockTest(); 

3. { }

4. 생성자

5. BlockTset bt2 = new BlockTest();

6. { }

7. 생성자



이상으로   static 초기화 / 인스턴스 초기화 / 명백한 초기화 / 생성자 초기화 

에 대한 포스팅을 마치겠다.

Posted by 구레이더