static 메서드와 static 블록이란?
static 메서드는 클래스에 소속되며, 클래스가 메모리에 로드될 때 함께 올라갑니다. 따라서 객체를 생성하지 않고도 클래스 이름만으로 호출할 수 있습니다.
반면 static 블록은 static 키워드로 선언된 코드 블록을 의미합니다. 주로 static 멤버 변수를 초기화하는 용도로 사용되며, JVM은 클래스 로딩 시점에 main 메서드보다 먼저 static 블록을 실행합니다.
예제 코드
public class Sample {
static int num = 50;
static {
System.out.println("안녕하세요, 저는 static 블록입니다");
}
public static void demo() {
System.out.println("static 메서드의 내용");
}
public static void main(String args[]) {
Sample.demo();
}
}실행 결과
안녕하세요, 저는 static 블록입니다 static 메서드의 내용
실행 결과를 보면 객체 생성이나 메서드 호출 없이도 static 블록이 가장 먼저 실행된 것을 확인할 수 있습니다.
static 메서드와 static 블록에 부과되는 제한 사항
static 메서드의 제한 사항
static 문맥(static context) 안에서는 인스턴스 멤버(비-static 메서드나 변수)에 직접 접근할 수 없습니다. 비-static 멤버는 객체가 생성되어야 존재하기 때문입니다.
this와super키워드는 static 문맥에서 사용할 수 없습니다. 두 키워드 모두 현재 객체 인스턴스를 참조하기 때문입니다.static 메서드는 오직 static 타입의 데이터(static 변수)만 접근할 수 있습니다.
static 메서드는 오버라이딩(재정의)할 수 없습니다. 상위 클래스와 같은 시그니처의 static 메서드를 하위 클래스에 정의하면 이는 재정의가 아니라 단순히 메서드 숨김(hiding)으로 처리됩니다.
static 블록의 제한 사항
static 블록은 어떤 값도 반환(return)할 수 없습니다.
static 블록은 명시적으로 직접 호출할 수 없습니다. 오직 클래스 로딩 시점에 JVM이 자동으로 한 번만 실행합니다.
static 블록 내부에서 예외가 발생할 가능성이 있다면 반드시 try-catch 블록으로 감싸 처리해야 하며, throws 절로 예외를 던질 수 없습니다. 그렇지 않으면
ExceptionInInitializerError가 발생하여 클래스 로딩 자체가 실패할 수 있습니다.static 블록 내부에서도
this와super키워드를 사용할 수 없습니다.여러 개의 static 블록이 있을 경우 실행 순서를 동적으로 제어할 수 없으며, 항상 소스 코드에 선언된 순서대로 실행됩니다.
정리
static 메서드와 static 블록은 객체 생성 없이 동작한다는 장점이 있지만, 그만큼 인스턴스 관련 기능(this/super 참조, 비-static 멤버 접근, 예외 전파 등)에 제약을 받습니다. 이러한 제한 사항을 정확히 이해하고 사용하면 초기화 로직이나 유틸리티 메서드 작성 시 발생할 수 있는 컴파일 오류와 런타임 오류를 효과적으로 예방할 수 있습니다.