"안녕, 아미고! Rishi가 너에게 새롭고 흥미로운 것을 설명했다고 들었어?!"

"맞아, 김."

"내 주제는 그다지 흥미롭지 않을 것입니다. 클래스가 메모리에 로드되는 방법에 대해 설명하고 싶습니다."

Java의 클래스는 컴파일된 Java 코드인 바이트코드를 포함하는 디스크의 파일입니다.

"네 기억합니다."

Java 머신은 필요하지 않으면 로드하지 않습니다. 코드 어딘가에 클래스에 대한 호출이 있는 즉시 Java 머신은 클래스가 로드되었는지 확인합니다. 그렇지 않은 경우 로드하고 초기화합니다.

클래스 초기화에는 모든 정적 변수에 값을 할당하고 모든 정적 초기화 블록을 호출하는 작업이 포함됩니다.

"객체에서 생성자를 호출하는 것과 비슷해 보입니다. 하지만 정적 초기화 블록이 무엇인가요?"

"객체를 초기화하기 위해 복잡한 코드(예: 파일에서 무언가 로드)를 실행해야 하는 경우 생성자에서 수행할 수 있습니다. 그러나 정적 변수에는 이러한 기회가 없습니다. 하지만 여전히 필요성이 남아 있으므로 다음을 수행할 수 있습니다. 클래스에 정적 초기화 블록 또는 블록을 추가합니다. 기본적으로 정적 생성자와 동일합니다."

다음과 같이 표시됩니다.

암호 실제로 일어나는 일
class Cat
{
public static int catCount = 0 ;
public static String namePrefix;

static
{
Properties p = new Properties();
p.loadFromFile("cat.properties");
namePrefix = p.get("name-prefix");
}

public static int maxCatCount = 50;

static
{
Properties p = new Properties();
p.loadFromFile("max.properties");
if (p.get("cat-max") != null)
maxCatCount = p.getInt("cat-max");
}

}


class Cat
{
public static int catCount;
public static String namePrefix;
public static int maxCatCount;

//Static constructors aren't allowed in Java,
//but if they were, everything
//would look like this
public static Cat()
{
catCount = 0;

Properties p = new Properties();
p.loadFromFile("cat.properties");
namePrefix = p.get("name-prefix");

maxCatCount = 50;

Properties p2 = new Properties();
p2.loadFromFile("max.properties");
if (p2.get("cat-max")!=null)
maxCatCount = p2.getInt("cat-max");
}
}

이는 생성자가 호출될 때 발생하는 것과 매우 유사합니다. 심지어 (존재하지 않는) 정적 생성자로 작성했습니다.

"예, 알겠습니다."

"매우 좋은."