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

자바(Java) 정적 블록과 생성자의 차이점 완벽 비교

자바에서 정적 블록(static block)생성자(constructor)는 모두 특정 시점에 자동으로 실행되는 코드 블록이지만, 실행되는 시점과 용도가 완전히 다릅니다. 이 글에서는 두 개념의 차이점을 예제 코드와 함께 자세히 살펴보겠습니다.

정적 블록(Static Block)이란?

  • 정적 블록은 클래스가 로딩(class loading)되는 시점에 실행됩니다.
  • main() 메서드가 실행되기 전에 먼저 호출됩니다.
  • 정적 블록은 이름이 없으며, 별도의 프로토타입(선언부)을 가지지 않습니다.
  • 클래스 로딩 시점에 반드시 수행해야 하는 초기화 로직이 있다면 정적 블록 안에 작성하면 됩니다.

문법(Syntax)

static {
    // 실행할 문장
}

예제(Example)

public class StaticBlockTest {
    static {
        System.out.println("Static Block!");
    }
    public static void main(String args[]) {
        System.out.println("Welcome to Tutorials Point!");
    }
}

실행 결과(Output)

Static Block!
Welcome to Tutorials Point!

위 예제를 보면 main() 메서드의 출력문보다 정적 블록의 출력문이 먼저 실행된 것을 확인할 수 있습니다. 이는 클래스가 메모리에 로딩되는 순간 정적 블록이 우선적으로 수행되기 때문입니다.

생성자(Constructor)란?

  • 생성자는 자바에서 객체를 생성(new)하는 시점에 실행됩니다.
  • 클래스의 인스턴스를 만들 때 자동으로 호출됩니다.
  • 생성자의 이름은 반드시 클래스 이름과 동일해야 하며, 반환 타입을 가지지 않습니다.
  • 생성자는 하나의 객체당 한 번씩 호출되며, 객체를 몇 개 생성했느냐에 따라 여러 번 실행될 수 있습니다. 즉, 객체가 만들어질 때마다 생성자가 자동으로 실행됩니다.

문법(Syntax)

public class MyClass {
    // 생성자
    MyClass() {
        // 실행할 문장
    }
}

예제(Example)

public class ConstructorTest {
    static {
        // 정적 블록
        System.out.println("In Static Block!");
    }
    public ConstructorTest() {
        System.out.println("In a first constructor!");
    }
    public ConstructorTest(int c) {
        System.out.println("In a second constructor!");
    }
    public static void main(String args[]) {
        ConstructorTest ct1 = new ConstructorTest();
        ConstructorTest ct2 = new ConstructorTest(10);
    }
}

실행 결과(Output)

In Static Block!
In a first constructor!
In a second constructor!

위 예제에서 주목할 점은 객체를 두 개 생성했음에도 정적 블록은 딱 한 번만 실행되었다는 것입니다. 정적 블록은 클래스 로딩 시점에 단 한 번 수행되며, 이후 객체를 아무리 많이 만들어도 다시 실행되지 않습니다. 반면 생성자는 객체를 생성할 때마다 각각 호출되었습니다.

정적 블록 vs 생성자 핵심 차이점 정리

구분정적 블록생성자
실행 시점클래스 로딩 시객체 생성 시
실행 횟수클래스당 단 한 번객체 수만큼 반복
이름 / 형태이름이 없는 블록클래스명과 동일한 이름
주요 용도클래스 수준 초기화(정적 변수 설정 등)인스턴스 수준 초기화

마무리

정리하자면, 정적 블록은 클래스 로딩 시점에 단 한 번 실행되어 클래스 수준의 초기화를 담당하고, 생성자는 객체가 생성될 때마다 실행되어 인스턴스 수준의 초기화를 담당합니다. 두 개념의 실행 시점과 목적을 정확히 이해하면 자바 프로그램의 초기화 흐름을 훨씬 쉽게 파악할 수 있습니다.