프로그래밍 언어/Java

[Java] 변수의 초기화

happy_life 2022. 6. 23. 00:02

목차

1. 변수의 초기화

2. 명시적 초기화

3. 초기화 블럭

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

 

 

 

1. 변수의 초기화

변수를 선언하고 처음으로 값을 저장하는 것을 "변수의 초기화"라고 한다. 가능하면 선언과 동시에 적절한 값으로 초기화하는 것이 좋다. 

멤버변수는 초기화 하지 않아도 자동적으로 변수의 자료형에 맞는 기본값으로 초기화가 이루어지므로 초기화하지 않아도 되지만, 지역변수는 사용하기 전에 반드시 초기화해야 한다.

 

코드예제

지역변수는 초기화하기 전에 사용하면

Variable might not have been initialized 라는 에러가 발생한다.

 

2. 명시적 초기화

변수를 선언과 동시에 초기화하는 것을 명시적 초기화라고 한다.

 

코드예제

public class InitializeEx2 {
    public static void main(String[] args) {
        int door = 4; // 기본형 초기화
        InitializeEx2 initializeEx2 = new InitializeEx2(); // 참조형 초기화
    }
}

 

3. 초기화 블럭

좀 더 복잡한 초기화를 위해 블럭이라는 것이 존재한다. 블럭에는 클래스 초기화 블럭과 인스턴스 초기화 블럭이 있다.

클래스 초기화 블럭 클래스변수의 복잡한 초기화에 사용
인스턴스 초기화 블럭 인스턴스변수의 복잡한 초기화에 사용

클래스  초기화 블럭은 클래스가 메모리에 처음 로딩될 때 한번만 수행되고, 인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 때마다 수행된다.

 

아래의 코드를 보며 이해해보자.

 

인스턴트 초기화 블럭 코드예제

public class InitializeEx3 {
    public static void main(String[] args) {
        Member member1 = new Member();
        Member member2 = new Member("김김김");

        System.out.println("member1.id = " + member1.id);
        //member1.id = 1
        System.out.println("member2.id = " + member2.id);
        //member2.id = 2
    }
}

class Member {
    int id;
    String name;
    static int count;
    // 인스턴스 블럭
    {
        count++;
        this.id = count;
    }
    Member() {
//        count++;
//        this.id = count;
     }

    Member(String name) {
//        count++;
//        this.id = count;
        this.name = name;
    }
}

위의 코드와 같이 인스턴스 초기화 블럭은  각각의 인스턴스 초기화의 공통된 부분을 따로 빼주는 경우 활용된다. Member가 두번 초기화되었으므로 count ++; 가 두번 실행되어 마지막에 member2.id = 2가 출력된 것이다.

 

클래스 초기화 블럭 코드 예제

public class InitializeEx4 {
    public static void main(String[] args) {
        int[] arr = StaticBlock.arr;
        for (int i=0;i<arr.length;i++) {
            System.out.println("arr["+i+"] : " + arr[i]);
        }
    }
}

class StaticBlock {
    static int[] arr = new int[10];

    // 클래스 초기화 블럭
    static {
        for (int i=0;i<arr.length;i++) {
            arr[i] = (int) (Math.random() * 10) + 1;
        }
    }
}

실행결과

 

 

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

클래스변수의 초기화 시점 클래스가 처음 로딩될 때 단 한번만 초기화
인스턴스 변수의 초기화 시점 인스턴스가 생성될 때마다 각 인스턴스별로 초기화
클래스변수 초기화 순서 기본값 -> 명시적 초기화 -> 클래스 초기화 블럭
인스턴스 변수의 초기화 순서 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블럭 -> 생성자

 

클래스 변수 초기화 순서 코드 예제

public class InitializeEx5 {
    static int x = 4; // 명시적 초기화
    static {
        x = 5; // 클래스 초기화 블럭
    }
    public static void main(String[] args) {
        System.out.println("x = " + x);
        // 4가 아닌 5가 나온다. 
        // 클래스 초기화 블럭에서 5로 초기화되었기 때문
    }
}

 

인스턴스 변수 초기화 순서 코드 예제

/**
 * 인스턴스 초기화 순서
 */
public class InitializeEx6 {
    public static void main(String[] args) {
        Apple apple = new Apple();
        System.out.println("apple.old = " + apple.old);
        // 6
    }
}

class Apple {
    int old = 4; //1. 명시적 초기화
    {
        this.old = 5; // 2. 인스턴스 초기화 블럭
    }
    Apple() {
        System.out.println("old = " + old);
        // 5
        this.old = 6; // 3. 생성자 초기화
    }
}

먼저 명시적 초기화로 생성자 Apple의 old 맴버 변수 old는 4일 것이다.

이후 인스턴스 초기화 블럭을 통해 5로 초기화된다. 이후 생성자 초기화가 실행된다.

생성자에서 6이라는 값을 넣어보기 전 출력해보면 5라는 결과가 나온다. 인스턴스 초기화로 입력된 5라는 값인 것이다.

생성자에 6라는 값으로 초기화한 후 main 메서드에서 출력해보면 6이 나오는 것을 알 수 있다.