프로그래밍 언어/자바

자바 16. 변수의 초기화

닉네임못짓는사람 2020. 8. 31. 10:20
반응형

이번 글에서는 변수의 초기화에 대해서 알아보도록 합시다.

다들 아시다시피 초기화란 변수를 선언하고 처음으로 값을 저장하는 것을 말합니다.

이 초기화는 필수적일 때도 있고, 선택적일 때도 있지만, 가능하면 선언과 동시에 초기화하는 것이 좋습니다.

 

이때 지역변수, 즉 메서드 내에 선언되어 있는 변수들은 사용하기 전에 꼭 초기화를 해주어야 하지만,

멤버변수는 초기화를 하지 않아도 자동으로 변수의 자료형에 따라 기본값이 저장되기 때문에 초기화 없이 사용이 가능합니다.

예를 들어 위와 같은 상황에서 인스턴스변수인 x는 자동으로 int의 기본값인 0이 저장되기 때문에 y에 값을 대입할 수 있습니다.

반면 지역변수인 i는 선언후 값을 초기화하지 않았기 때문에 j에 값을 대입할 수가 없어 오류가 발생합니다.

각 자료형의 기본값은 이전에 배열을 설명할 때 한 번 언급했기 때문에 궁금하시다면 그 글을 참고하시기 바랍니다.

 

멤버변수의 초기화 방법은 지역변수와 달리 몇 가지 방법이 있는데 이들을 알아보도록 합시다.

1. 명시적 초기화

명시적 초기화란 변수를 선언함과 동시에 초기화하는 것을 말합니다.

가장 기본적이면서도 간단한 방법이기 때문에 초기화 방법들중 가장 우선적으로 고려해보는 것이 바람직합니다.

class Tv{
    int width = 100;
    int height = 50;
}

2. 초기화 블럭

먼저 초기화 블럭은 '클래스 초기화 블럭'과 '인스턴스 초기화 블럭'의 두 가지 종류로 나뉩니다.

전자는 클래스변수의 초기화에 사용되고, 후자는 인스턴스 변수의 초기화에 사용됩니다.

초기화 블럭을 작성하는 방법은 인스턴스변수의 경우 클래스 내에 블럭{}을 만들고 그 안에 코드를 작성하기만 하면 됩니다.

클래스변수의 경우는 인스턴스 방식에서 앞에 static을 추가하기만 하면 되니 매우 간단합니다.

static{
    클래스변수 초기화 코드
}
{
    인스턴스변수 초기화 코드
}

클래스 초기화 블럭의 경우 클래스가 메모리에 처음 로딩될 때 단 한번만 수행되며,

인스턴스 초기화 블럭의 경우 인스턴스가 생성될 때마다 생성됩니다.

또한 생성자와 인스턴스 초기화 블럭이 같이 있을경우 생성자보다 인스턴스 초기화 블럭이 먼저 수행되는 점 기억해두시길 바랍니다.

 

인스턴스변수의 초기화는 주로 생성자를 사용하기 때문에 초기화 블럭은 많이 사용되지는 않습니다만,

보통 클래스 내의 모든 생성자가 공통으로 수행해야 하는 코드가 있다면 코드의 중복을 줄이기 위해 사용합니다.

 

마지막은 생성자인데, 생성자에 대해서는 이미 알아봤으니 생략하도록 하겠습니다.

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


이렇게 멤버변수를 초기화하는 몇 가지 방법에 대해서 알아보았는데,

그럼 이제 초기화가 수행되는 시기와 순서에 대해서도 한 번 알아보도록 합시다.

먼저 시기부터 이야기하자면, 아시다시피 클래스 변수의 경우 클래스가 로딩될 때 단 한 번만 초기화됩니다.

그리고 인스턴스 변수의 경우 인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 실행됩니다.

 

순서는 여러 초기화 방법이 있을 때 어떤 것이 우선적으로 실행되는 것인지 라고 생각하시면 될 것 같습니다.

클래스변수의 경우 기본값 -> 명시적 초기화 -> 클래스 초기화 블럭의 순서로 초기화 되고,

인스턴스변수의 경우 기본값 -> 명시적 초기회 -> 인스턴스 초기화 블럭 -> 생성자의 순서로 초기화됩니다.

 

프로그램 실행 중 클래스에 대한 정보가 요구되면, 클래스는 메모리에 로딩됩니다.

클래스 멤버를 사용했을 때, 인스턴스를 생성했을 때 등이 이 경우에 해당합니다.

이때 클래스가 이미 메모리에 로딩되어 있다면, 다시 로딩하지 않습니다.

때문에 클래스가 메모리에 로딩될 때 실행되는 클래스변수의 초기화가 한 번만 이루어지는 것입니다.

 

예제를 통해 위에서 알아봤던 내용을 확인해보도록 합시다.

public class example{
    public static void main(String[] args){
        Document d1 = new Document();
        Document d2 = new Document("자바1");
        Document d3 = new Document();
        Document d4 = new Document();
    }
}
class Document{
    static int count = 0;
    String name;

    {
        System.out.print("문서 생성중... ");
    }

    Document(){
        this("제목없음" + ++count);
    }

    Document(String name){
        this.name = name;
        System.out.println("문서 " + this.name + "가 생성되었습니다.");
    }
}

위의 코드는 여러분이 워드프로세서 등의 새 파일을 생성하면 이름을 정해주는 것과 유사한 코드입니다.

파일을 생성할 때, 이름을 지정하면 그 이름으로 파일이 생성되지만, 반면에 이름을 지정하지 않으면

작성자가 정해놓은 규칙에 따라 각각의 파일의 이름을 구분할 수 있도록 이름을 정해서 파일을 생성합니다.

 

이상으로 변수의 초기화에 대한 설명을 마치도록 하겠습니다.

감사합니다.

 

반응형