자바에서 정적 블록(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 생성자 핵심 차이점 정리
| 구분 | 정적 블록 | 생성자 |
|---|---|---|
| 실행 시점 | 클래스 로딩 시 | 객체 생성 시 |
| 실행 횟수 | 클래스당 단 한 번 | 객체 수만큼 반복 |
| 이름 / 형태 | 이름이 없는 블록 | 클래스명과 동일한 이름 |
| 주요 용도 | 클래스 수준 초기화(정적 변수 설정 등) | 인스턴스 수준 초기화 |
마무리
정리하자면, 정적 블록은 클래스 로딩 시점에 단 한 번 실행되어 클래스 수준의 초기화를 담당하고, 생성자는 객체가 생성될 때마다 실행되어 인스턴스 수준의 초기화를 담당합니다. 두 개념의 실행 시점과 목적을 정확히 이해하면 자바 프로그램의 초기화 흐름을 훨씬 쉽게 파악할 수 있습니다.