정적 블록
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;
}
}
}정적 블록은 정적 배열이나 컬렉션을 초기화하고, 계산이 필요한 설정 값을 설정하며, 클래스 수준에서 일회성 설정 작업을 수행하는 데 흔히 사용됩니다.
챌린지
쉬움클래스가 처음 로드될 때 정적 블록(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 등),configLoaded를true로 설정합니다. - 해당 레벨의 점수 임계값을 반환하는 static 메서드
getThreshold(int level)(레벨은 1부터 시작함) - 최대 레벨을 반환하는 static 메서드
getMaxLevel() - 구성 로드 여부를 반환하는 static 메서드
isConfigLoaded()
- 각 레벨에 도달하는 데 필요한 점수를 저장하는 private static 배열
Main.java: 클래스에 액세스할 때 정적 블록이 자동으로 실행되는지 확인합니다. 조회할 레벨 번호라는 하나의 입력을 받게 됩니다. 다음 네 줄을 출력하세요:Config loaded: true또는Config loaded: falseMax 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]"
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조