public static void main (String[] args)
자바를 공부하기 시작하면 가장 먼저 접하는게 위의 main 메서드가 아닐까 싶습니다.
자바 가상 머신(JVM)은 프로그램을 실행할 때 이 메서드를 호출해 프로그램의 시작 지점으로 사용합니다.
그런데 왜 main 메서드는 항상 static으로 선언되어야 할까요? 그 이유를 이해하기 위해서는 static 키워드의 의미와 활용에 대해 알아볼 필요가 있습니다.
static 키워드는 클래스 수준에서 변수나 메서드를 정의할 때 사용됩니다.
static으로 선언된 변수나 메서드는 클래스 로딩 시점에 메모리에 할당되며, 객체 인스턴스를 생성하지 않고도 사용할 수 있습니다.
이를 통해 메모리 사용 효율을 높이고, 공통 데이터를 공유할 수 있습니다.
class Family {
static String familyName = "Kim";
}
public class Main {
public static void main(String[] args) {
Family member1 = new Family();
Family member2 = new Family();
System.out.println(Family.familyName); // 출력: Kim
}
}
위 예시에서 Family 클래스의 familyName 변수는 static으로 선언되었습니다.
static이 없다면 Family 객체가 생성될 때마다 familyName 변수가 새로 생성되겠지만, static으로 선언하면 메모리 할당을 한 번만 하게 됩니다.
따라서 static 변수는 모든 객체가 같은 메모리 주소를 바라보기 때문에 값을 공유하게 됩니다.
static 키워드는 메서드에도 적용됩니다.
static 메서드는 클래스 인스턴스를 생성하지 않고도 호출할 수 있습니다. 보통 유틸리티성 메서드나 싱글톤 패턴을 구현할 때 자주 사용됩니다.
class Calculator {
static int add(int a, int b) {
return a + b;
}
static int multiply(int a, int b) {
return a * b;
}
}
public class Main {
public static void main(String[] args) {
int sum = Calculator.add(5, 3); // 출력: 8
int product = Calculator.multiply(5, 3); // 출력: 15
System.out.println("Sum: " + sum); // 출력: Sum: 8
System.out.println("Product: " + product); // 출력: Product: 15
}
}
위 예제에서 add와 multiply 메서드는 static으로 선언되어 객체를 생성하지 않고도 호출할 수 있습니다.
자바 프로그램이 실행될 때 JVM은 가장 먼저 main 메서드를 호출합니다.
이때 프로그램은 아직 어떤 객체도 생성되지 않은 상태입니다.
즉, main 메서드는 클래스의 인스턴스를 생성하지 않고도 호출될 수 있어야 합니다.
💡 이를 가능하게 하는 것이 바로 static 키워드입니다!
static으로 선언된 메서드는 클래스가 로드될 때 메모리에 할당됩니다.
즉, static 메서드는 프로그램 시작 시점부터 메모리에 존재하게 되므로, 객체 생성 없이도 호출할 수 있습니다.
이게 바로 JVM이 자바 프로그램을 실행할 때 main 메서드를 호출할 수 있는 이유입니다.
- 자바 애플리케이션이 실행되면 JVM은 먼저 해당 클래스 파일을 로드합니다.
- 클래스 로딩 과정에서 static으로 선언된 메서드와 변수들이 메모리에 할당됩니다.
- 이로 인해 JVM은 프로그램 시작과 동시에 main 메서드를 호출할 수 있습니다.
만약 main 메서드가 static으로 선언되지 않았다면, JVM은 프로그램 실행 초기에 해당 클래스의 인스턴스를 생성해야만 main 메서드를 호출할 수 있을 것입니다.
이는 프로그램 시작 과정에 불필요한 복잡성을 더하게 됩니다.
main 메서드는 자바 애플리케이션의 시작 지점을 제공하는 중요한 역할을 합니다. static + main 메서드로 선언되어야만 JVM이 프로그램의 시작 지점을 정확하게 인식하고 실행할 수 있습니다.
❗️ 만약 main 메서드에 static을 제거하고 실행시키면 JVM에서 인식하지 못하고 "NoSuchMethodError: main" 오류 발생하면서 실행이 불가능합니다.
static은 Gabage Collector의 정리 대상이 아닙니다. 즉, static으로 선언해야 main 메서드가 메모리에 항상 상주하도록 설정할 수 있습니다.
main 메서드가 static으로 선언되어야 하는 이유는 프로그램 시작 시 클래스의 인스턴스를 생성하지 않고도 호출할 수 있어야 하기 때문입니다. 이는 프로그램의 시작 지점을 명확히 하고, 불필요한 객체 생성 과정을 제거하여 프로그램 구조를 단순화합니다. 또한, static 메서드는 클래스 로딩 시점에 메모리에 할당되므로, JVM이 프로그램 실행 시점에 바로 호출할 수 있습니다.