DEV-STUDY/Java

변수 초기화에 대한 탐구

HwangJerry 2024. 1. 22. 15:08

우리는 많은 경우에 습관적으로 데이터를 초기화하여 사용합니다. 하지만 경우에 따라 자바는 기본적으로 초기화를 해 주는 경우도 있는데요. 이를 분명하게 인지하고 사용하고자 해당 내용을 명확하게 정리해 보겠습니다.

지역 변수와 초기화

먼저, 지역 변수에 대해 알아보겠습니다. 지역 변수란 특정 영역 내에서만 사용되는 변수를 말합니다. 예를 들어, 메서드 또는 제어문 안에서 선언된 변수가 이에 해당합니다. 이렇게 선언되는 지역 변수는 반드시 초기화를 해 줘야 사용이 가능합니다.

public class Main {
    public static void main(String[] args) {
        int a;
        System.out.println(a);
    }
}

예시 코드를 보겠습니다. 위 코드에서 int a;는 main 메서드 내에서 선언된 지역 변수입니다. 이 변수는 초기화되지 않고 선언만 되어있습니다. 이 경우, System.out.println(a);를 호출하면 컴파일 에러가 발생합니다. 이유는 자바에서 지역 변수는 자동으로 초기화되지 않기 때문입니다. 따라서, 지역 변수의 경우에는 이를 사용하기 전에 반드시 초기화해야 합니다.

참조 변수와 초기화

이번에는 참조 변수에 대해 알아보겠습니다. 참조 변수는 기본적으로 초기화가 되지 않으면 기본 값으로 자동으로 초기화됩니다. (참고로, 참조 변수는 클래스 인스턴스를 표현하는 변수 뿐만 아니라 배열 변수int[] arr과 같은 경우도 포함됩니다.)

public class Example {
    public int a;
}

public class Main {
    public static void main(String[] args) {
        Example e = new Example();
        System.out.println(e.a);
    }
}

위 코드에서 public int a;는 클래스의 속성입니다. 이 변수는 생성자에서 초기화하지 않더라도 객체가 생성되면 기본값으로 자동으로 초기화됩니다. 따라서, 위 상황에서는 System.out.println(e.a);를 호출하면 0이 출력됩니다.

 

 

 

참조 변수의 데이터 타입 초기화

그렇다면, int 타입 외의 다른 데이터 타입에 대해서는 어떻게 초기화가 이루어지는지 알아보겠습니다.

  1. 정수 타입(int, byte, short, long): 0으로 초기화됩니다.
  2. 실수 타입(float, double): 0.0으로 초기화됩니다.
  3. 문자 타입(char): '\u0000'로 초기화됩니다. (null과는 분명히 다르지만, null과 같은 의미를 유니코드로 \u0000로 표현합니다. null은 원시 타입과 compatible type이 아니므로 대입시 에러가 발생합니다.)
  4. 불린 타입(boolean): false로 초기화됩니다.
  5. 참조 타입(클래스, 인터페이스, 배열 등): null로 초기화됩니다.
public class Example {
    public int intValue;
    public double doubleValue;
    public char charValue;
    public boolean booleanValue;
    public String stringValue;
}

public class Main {
    public static void main(String[] args) {
        Example e = new Example();
        System.out.println(e.intValue);       // 출력: 0
        System.out.println(e.doubleValue);    // 출력: 0.0
        System.out.println(e.charValue);      // 출력: (아무것도 출력되지 않음)
        System.out.println(e.booleanValue);   // 출력: false
        System.out.println(e.stringValue);    // 출력: null
    }
}

위의 코드에서 보면, 각 데이터 타입에 따라 클래스 변수가 어떻게 초기화되는지 확인할 수 있습니다. 이러한 자동 초기화 기능은 클래스 변수가 사용되기 전에 항상 유효한 값을 가지도록 보장합니다.

 

+++

 

이와 유사한 원리로, 클래스 로딩할 때 값이 들어가 있어야 하는 클래스 전역 변수에 대하여도 초기화가 자동으로 이루어집니다.

public class Example {
    private static int n;
    
    public static void main(String[] args) {
    	System.out.println(n); // output : 0
    }
}

 

 

마무리

기본적으로 로컬 변수는 전부 초기화를 하여 사용해야 하고, 그렇지 않으면 컴파일 에러를 터뜨립니다. 하지만 참조 변수들의 경우에는 힙에 저장하는 과정에서 기본 값을 매겨서 저장하기 때문에 만약 멤버 변수들에 대하여 초기화를 하지 않는 경우에는 해당 값들로 들어갈 수 있음을 분명하게 알고 있어야 합니다.

 

사실... 개발을 할 때에는 초기화를 분명히 하고 사용하는 경우가 많아서 기본값 초기화를 사용하는 일은 잘 없었는데, 자바를 이용하여 알고리즘을 구성할 때에는 배열 초기화에 대하여는 종종 사용하고 있어서 한번 명확하게 인지하고 사용하려고 정리해 봤습니다.