Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 기본 생성자에서 정적(static) 변수를 초기화할 수 있을까?

Java의 정적 변수와 생성자를 통한 초기화

클래스 변수(정적 변수)는 클래스에 속하는 변수입니다. 인스턴스 변수처럼 클래스 내부의 메서드 밖에서 선언되지만, static 키워드가 붙는다는 점이 다릅니다.

정적 변수는 컴파일 시점부터 접근이 가능하며, 클래스를 인스턴스화하기 전이나 인스턴스 없이도 사용할 수 있습니다. 또한 정적 필드는 클래스 전체에서 단 하나의 복사본만 존재하기 때문에, 모든 객체가 동일한 값을 공유하게 됩니다. 정적 필드는 static 키워드를 사용하여 선언합니다.

클래스에서 정적 변수를 선언했는데 초기화하지 않았다면, 인스턴스 변수와 마찬가지로 컴파일러가 기본 생성자(default constructor)에서 기본값으로 자동 초기화해 줍니다.

그렇다면 생성자를 통해 이 값을 직접 초기화할 수도 있을까요? 네, 가능합니다.

예제 코드

public class DefaultExample {
    static String name;
    static int age;
    DefaultExample() {
        name = "Krishna";
        age = 25;
    }
    public static void main(String args[]) {
        new DefaultExample();
        System.out.println(DefaultExample.name);
        System.out.println(DefaultExample.age);
    }
}

실행 결과

Krishna
25

static과 final을 함께 선언하는 경우

그러나 인스턴스 변수를 staticfinal로 함께 선언하면 상황이 달라집니다. Java 컴파일러는 final 변수를 기본 생성자에서 자동으로 초기화해 주지 않기 때문에, static final 변수는 반드시 명시적으로 초기화해야 합니다. 그렇지 않으면 컴파일 타임 오류가 발생합니다.

예제 코드

public class DefaultExample {
    static final String name;
    static final int age;
    public static void main(String args[]) {
        new DefaultExample();
        System.out.println(DefaultExample.name);
        System.out.println(DefaultExample.age);
    }
}

컴파일 타임 오류

DefaultExample.java:2: error: variable name not initialized in the default constructor
    static final String name;
                        ^
DefaultExample.java:3: error: variable age not initialized in the default constructor
    static final int age;
                     ^
2 errors

또 하나 주의할 점은, final이면서 static으로 선언된 변수를 생성자 안에서 초기화하려고 하면, 컴파일러는 이를 final 변수에 값을 재할당하려는 시도로 간주하여 컴파일 타임 오류를 발생시킨다는 것입니다.

예제 코드

public class DefaultExample {
    static final String name;
    static final int age;
    DefaultExample() {
        name = "Krishna";
        age = 25;
    }
    public static void main(String args[]) {
        new DefaultExample();
        System.out.println(DefaultExample.name);
        System.out.println(DefaultExample.age);
    }
}

컴파일 타임 오류

DefaultExample.java:5: error: cannot assign a value to final variable name
    name = "Krishna";
         ^
DefaultExample.java:6: error: cannot assign a value to final variable age
    age = 25;
         ^
2 errors

정리

  • 일반적인 static 변수는 생성자에서 초기화할 수 있으며, 초기화하지 않으면 컴파일러가 기본값으로 채웁니다.
  • static final 변수는 반드시 선언 시점이나 정적 초기화 블록(static initializer block)에서 초기화해야 합니다.
  • static final 변수를 생성자에서 할당하려고 하면 "cannot assign a value to final variable" 오류가 발생합니다.