Java에서 main() 메소드는 항상 static으로 선언됩니다. 그 이유는 컴파일러(JVM)가 클래스의 객체를 생성하지 않고도, 또는 객체 생성 이전에 main() 메소드를 호출할 수 있어야 하기 때문입니다.
main() 메소드가 static이어야 하는 이유
- 모든 Java 프로그램에서 main() 메소드는 프로그램 실행의 시작점입니다. JVM은 이 메소드를 가장 먼저 호출해야 하므로, 객체 없이 바로 호출할 수 있는 방법이 필요합니다.
- 만약 main() 메소드가 non-static이라면, JVM이 이를 호출하기 위해 해당 클래스의 인스턴스(객체)를 먼저 생성해야 합니다.
- 객체를 생성하려면 반드시 클래스의 생성자를 호출해야 하는데, 만약 생성자가 매개변수를 요구한다면 JVM은 어떤 값을 전달해야 할지 알 수 없어 모호성(ambiguity) 문제가 발생합니다.
- static 메소드는 객체를 생성하지 않고 클래스 이름만으로 직접 호출할 수 있습니다. 따라서 JVM은
클래스명.main(args)형태로 간단히 프로그램을 시작할 수 있습니다.
main() 메소드의 필수 선언 형식
Java의 main() 메소드는 반드시 public, static, void로 선언되어야 합니다. 세 키워드의 역할은 다음과 같습니다.
- public: JVM 어디서든 접근할 수 있도록 외부에 공개합니다.
- static: 객체 생성 없이 클래스 레벨에서 호출 가능하게 만듭니다.
- void: main() 메소드는 종료 후 아무 값도 반환하지 않습니다.
만약 이 중 하나라도 누락되면 프로그램은 컴파일까지는 성공하지만, 실행 시점에 "Main method not found in class"와 같은 런타임 오류가 발생합니다.
예제 코드
아래 예제는 static 메소드를 객체 생성 없이 클래스 이름만으로 호출하는 방법을 보여줍니다.
class Book {
public static void getBookInfo() { //static 메소드
System.out.println("Welcome to TutorialsPoint Library");
}
}
public class Test {
public static void main(String[] args) {
// Book 클래스의 static 메소드를 클래스 이름만으로 호출
Book.getBookInfo();
}
}실행 결과
Welcome to TutorialsPoint Library
정리
결론적으로 main() 메소드가 static인 이유는 JVM이 프로그램 시작 시점에 객체 생성 과정 없이 곧바로 진입점(entry point)을 호출할 수 있도록 하기 위함입니다. 이를 통해 생성자 매개변수로 인한 모호성 문제를 피하고, 일관된 방식으로 프로그램 실행을 시작할 수 있습니다.