본문 바로가기
Java

변수의 초기화

by Kloong 2022. 1. 20.

클래스의 멤버 변수의 초기화 방법에는 3가지 종류가 있다.

  1. 명시적 초기화(Explicit initialization)
  2. 생성자(Constructor)
  3. 초기화 블럭(Initialization block)
    • 인스턴스 초기화 블럭
    • 클래스 초기화 블럭

1. 명시적 초기화(Explicit initialization)

변수를 선언과 동시에 초기화 하는 방법

class Car
{
    int door = 4;
    Engine e = new Engine();
}

2. 생성자(Constructor)

class Car
{
    int door;
    Engine e;
    
    Car()
    {
        door = 4;
        e = new Engine();
    }
}

3. 초기화 블럭(Initialization block)

  • 클래스 초기화 블럭: 클래스변수의 복잡한 초기화에 사용된다.
  • 인스턴스 초기화 블럭: 인스턴스변수의 복잡한 초기화에 사용된다.
class Car
{
    static int count;
    static int[] randArr = new int[10];
    
    int serialNo;
    int door;
    String color;
    
    static
    {
        count = 0;
        
        //명시적 초기화로는 어려운 초기화를 초기화 블럭에서 해줌
        for (int i = 0; i < randArr.length; i++)
            randArr[i] = (int)(Math.random() * 10) + 1;
     }
    
    //모든 생성자에서 공통으로 사용되는 코드를 따로 빼서 인스턴스 초기화 블럭으로 만듦
    {
        count++;
        serialNo = count;
        
        //초기화 블럭에서는 조건문, 반복문, 예외처리구문 등을 자유롭게 사용 가능
        //생성자에서 공통적으로 배열을 초기화하는 등의 경우에 사용하면 유용하다
        if (count > 10)
            System.out.println("차가 너무 많아요!");
    }   
    
    Car()
    {
        this(4, "White");
    }
    
    Car(int door, String color)
    {
        this.door = door;
        this.color = color;
    }
}

초기화 블럭 내에서는 조건문, 반목문, 예외처리구문 등을 자유롭게 사용할 수 있다.

클래스 초기화 블럭은 JVM에 의해 클래스가 메모리에 로딩될 때 단 한번만 실행된다. 클래스 변수를 명시적 초기화 만으로는 초기화하기 어려울 때 사용하면 유용하다.

인스턴스 초기화 블럭의 경우 인스턴스를 만들 때 생성자와 함께 실행되므로(정확히는 생성자보다 먼저 실행된다) 여러 생성자에 공통적으로 들어가는 초기화 코드를 초기화 블럭에 넣어줌으로써 코드를 간결하게 만들 수 있다.

4. 멤버변수의 초기화 시기와 순서

초기화 시점

클래스변수: 클래스가 처음 로딩될 때 단 한번 초기화 된다. 프로그램 실행 도중 클래스에 대한 정보가 요구될 때(클래스 멤버 사용, 인스턴스 생성 등) 메모리에 로딩된다.

인스턴스변수: 인스턴스가 생성될 때마다 각 인스턴스별로 초기화

초기화순서

클래스변수: Default값 -> 명시적 초기화 -> 초기화 블럭

인스턴스변수: Default값 -> 명시적 초기화 -> 초기화 블럭 -> 생성자

댓글