Menu
Coddy logo textTech

정적 블록

Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 87개 중 17번째.

때로는 단순한 할당보다 더 복잡한 로직으로 정적 변수를 초기화해야 할 때가 있습니다. 정적 블록(정적 초기화자라고도 함)은 클래스가 처음 로드될 때, 객체가 생성되거나 정적 메서드가 호출되기 전에 한 번 실행됩니다.

public class DatabaseConfig {
    private static String connectionString;
    private static int maxConnections;
    
    static {
        // 복잡한 초기화 로직
        connectionString = "jdbc:mysql://localhost:3306/mydb";
        maxConnections = 10;
        System.out.println("Database configuration loaded");
    }
}

static 블록은 클래스가 메모리에 로드될 때 자동으로 실행됩니다. 이는 생성하는 객체의 수와 상관없이 단 한 번만 발생합니다. 여러 문장, 계산 또는 조건부 로직이 필요한 초기화에 적합합니다.

클래스 내에 여러 개의 정적 블록을 가질 수 있으며, 이들은 나타나는 순서대로 실행됩니다:

public class AppSettings {
    private static int[] values;
    
    static {
        values = new int[5];
    }
    
    static {
        for (int i = 0; i < values.length; i++) {
            values[i] = i * 10;
        }
    }
}

정적 블록은 정적 배열이나 컬렉션을 초기화하고, 계산이 필요한 설정 값을 설정하며, 클래스 수준에서 일회성 설정 작업을 수행하는 데 흔히 사용됩니다.

challenge icon

챌린지

쉬움

클래스가 처음 로드될 때 정적 블록(static blocks)을 사용하여 게임 설정을 초기화하는 GameConfig 시스템을 만들어 보겠습니다. 이는 게임 객체가 생성되기 전에 한 번 계산되거나 설정되어야 하는 구성에 적합합니다.

코드를 구성하기 위해 두 개의 파일을 생성합니다:

  • GameConfig.java: 정적 블록을 사용하여 설정을 초기화하는 구성 클래스를 만듭니다:
    • 각 레벨에 도달하는 데 필요한 점수를 저장하는 private static 배열 levelThresholds (int[])
    • 총 레벨 수를 저장하는 private static 변수 maxLevel (int)
    • 초기화 발생 여부를 추적하는 private static 변수 configLoaded (boolean)
    • 정적 블록을 사용하여 maxLevel을 5로 초기화하고 "Initializing game configuration..."을 출력합니다.
    • 두 번째 정적 블록을 사용하여 maxLevel과 동일한 크기의 levelThresholds 배열을 생성한 다음, 각 레벨에 level * 100 포인트가 필요하도록 채우고(레벨 1은 100, 레벨 2는 200 등), configLoadedtrue로 설정합니다.
    • 해당 레벨의 점수 임계값을 반환하는 static 메서드 getThreshold(int level) (레벨은 1부터 시작함)
    • 최대 레벨을 반환하는 static 메서드 getMaxLevel()
    • 구성 로드 여부를 반환하는 static 메서드 isConfigLoaded()
  • Main.java: 클래스에 액세스할 때 정적 블록이 자동으로 실행되는지 확인합니다. 조회할 레벨 번호라는 하나의 입력을 받게 됩니다. 다음 네 줄을 출력하세요:
    • Config loaded: true 또는 Config loaded: false
    • Max level: [maxLevel]
    • Level [level] threshold: [threshold]
    • Level 1 threshold: [threshold] (항상 레벨 1도 함께 표시)

조회할 레벨 번호(int)를 하나의 입력으로 받게 됩니다.

Main 코드가 실행되기 전에 초기화 메시지가 어떻게 출력되는지 확인해 보세요. 그것이 바로 클래스가 처음 로드될 때 실행되는 정적 블록입니다!

치트 시트

정적 블록(또는 정적 초기화자)은 클래스가 처음 로드될 때, 객체가 생성되거나 정적 메서드가 호출되기 전에 한 번 실행됩니다. 여러 문이 필요한 복잡한 초기화 로직에 사용됩니다.

public class Example {
    private static String value;
    
    static {
        // 초기화 로직
        value = "initialized";
        System.out.println("Static block executed");
    }
}

정적 블록은 클래스가 메모리에 로드될 때 자동으로 실행되며, 생성되는 객체의 수에 관계없이 단 한 번만 실행됩니다.

클래스 내에 여러 개의 정적 블록을 가질 수 있습니다. 이들은 나타나는 순서대로 실행됩니다:

public class Example {
    private static int[] values;
    
    static {
        values = new int[5];
    }
    
    static {
        for (int i = 0; i < values.length; i++) {
            values[i] = i * 10;
        }
    }
}

일반적인 용도로는 정적 배열이나 컬렉션 초기화, 계산이 필요한 설정값 설정, 클래스 수준에서의 일회성 설정 작업 수행 등이 있습니다.

직접 해보기

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int level = scanner.nextInt();
        
        // TODO: static 블록 실행을 확인하기 위해 GameConfig에 접근하세요
        // GameConfig의 static 블록은 클래스에 처음 접근할 때 자동으로 실행됩니다
        
        // TODO: 설정 로드 여부를 출력하세요
        // 형식: "Config loaded: true" 또는 "Config loaded: false"
        
        // TODO: 최대 레벨을 출력하세요
        // 형식: "Max level: [maxLevel]"
        
        // TODO: 입력받은 레벨에 대한 임계값을 출력하세요
        // 형식: "Level [level] threshold: [threshold]"
        
        // TODO: 레벨 1에 대한 임계값을 출력하세요
        // 형식: "Level 1 threshold: [threshold]"
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨