Language/Java

[Java]변수의 초기화

Hoplin 2021. 12. 27. 13:14
반응형

초기화

초기화란 변수를 선언하고 처음으로 값을 저장하는것을 의미한다. 이 초기화 작업은 상황에 따라 필수적이기도 하고 필수적이지 않기도 하다. 다만, 지역변수는 사용하기 전에 꼭 초기화를 해주는것이 좋다.

 

멤버변수의 초기화는 지역변수와 달리 여러가지 방법이 있다.

 

  1.   명시적 초기화(explicit initialization)
  2.  생성자(Constructor)
  3. 초기화 블록(Initializtion Block)
    1. 인스턴스 초기화 블록 : 인스턴스 변수를 생성할 때 마다 실행되는 블록
    2. 클래스 초기화 블록 : 클래스 변수에 대해 초기화를 수행하는 블록

 

명시적 초기화

명시적 초기화는 일반적인 변수선언과 똑같은 방식이다. 다른 초기화 방법들 중 가장 우선시 고려되는 방법이다.

class test{
    private int count = 0;
    private static int[] arr = new int[20];
}

초기화 블록

초기화 블록에는 '클래스 초기화 블록' 과 '인스턴스 초기화 블록' 두가지가 존재한다. 클래스 초기화 블록은 클래스 변수 초기화에 사용되고, 인스턴스 초기화 블록은 인스턴스 초기화에 사용된다. 각 형태는 아래와 같다. 클래스 초기화 블록은 인스턴스 초기화 블록 앞에 static을 덧붙인 형태이다

class test{
    //클래스 초기화 블록
    static{}
    //인스턴스 초기화 블록
    {}
}

클래스 초기화 블록은 클래스가 메모리에 처음 올라갈때 최초 한번만 수행되고, 인스턴스 초기화 블록은 인스턴스를 생성할 때 마다 수행된다. 인스턴스 초기화에 있어서 알아두어야 할것은 인스턴스 초기화 블록은 생성자보다 먼저 수행된다는 것이다.

 

인스턴스 초기화 블록은 모든 생성자에서 공통적으로 수행해야하는 코드를 넣는다. 예를 들면, 생성된 인스턴스 개수를 추가해주는 코드를 예시로 들 수 있다.

class Product{
    private static int count = 0;
    int serialNumber;
    //인스턴스 생성자 블록 : 인스턴스가 생성될 때마다 클래스 변수 count를 ++ 한다.
    {
        count++;
        serialNumber = count;
    }

    public static int returnNumber(){
        return count;
    }

    public Product(){
        System.out.println("Constructor");
    }
}
class t2{
    public static void main(String[] args){
        Product p1 = new Product();
        System.out.println(p1.returnNumber());
        Product p2 = new Product();
        System.out.println(p2.returnNumber());
        Product p3 = new Product();
        System.out.println(p3.returnNumber());
    }
}

이번에는 멤버변수 초기화 시기와 순서를 알아보자

 

/*
*
* 클래스 초기화 블록 : 클래스 변수의 복잡한 초기화에 사용된다
* 인스턴스 초기화 블록 : 인스턴스변수의 복잡한 초기화에 사용된다.
*
* 인스턴스 초기화 블록은 단순히 클래스 내에 블록을 만들고({}) 그 안에 코드를 작성
* 클래스 초기화 블록은 인스턴스 초기화 블록 형태 앞에 static을 붙이면 된다.
*
* 클래스 초기화 블록 : 클래스가 메모리에 처음 로딩될때 한번 수행
* 인스턴스 초기화 블록 : 생성자와 같이 인스턴스를 생성할때마다 수행
*  */


class BlockTest{
    static {
        System.out.println("static {}");
    }
    {
        System.out.println("{}");
    }
    public BlockTest(){
        System.out.println("생성자");
    }
}


class m{
    public static void main(String[] args){
        BlockTest b1 = new BlockTest();
        BlockTest b2 = new BlockTest();
    }
}

위 코드 실행 결과를 기반으로 보면

 

클래스 변수는 딱 한번 실행된다. 이 시점이 바로 클래스가 메모리에 로딩된 시점이다. 인스턴스 b1,b2가 생성될 때마다, 인스턴스 초기화 블록이 실행되는것을 알 수 있다. 그리고 추가적으로 순서는 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블록 -> 생성자 순으로 초기화가 된다.

 

이를 활용한 코드는 아래와 같다.

class Document{
    static private int docCount;
    static private String defaultName;
    private String name;
    static {
        defaultName = "No title";
        docCount = 0;
    }

    Document(){
        this(defaultName + (++docCount));
    }
    Document(String title){
        this.name = title;
        System.out.println("New Document Generated : " + this.name + ".docx");
    }
}

public class t3 {
    public static void main(String[] args){
        Document d1 = new Document();
        Document d2 = new Document("test");
    }
}
반응형