자바를 처음 배우면 가장 먼저 접하는 메서드가 바로 main
메서드입니다. 하지만 "왜 main
메서드는 항상 static
으로 선언되어야 하는가?"라는 질문에 대해 깊이 생각해 본 적 있으신가요? 이번 포스팅에서는 자바의 main
메서드와 static
키워드의 관계를 쉽게 이해할 수 있도록 정리해 보겠습니다.
1. main
메서드란?
main
메서드는 자바 애플리케이션의 진입점(entry point)입니다. JVM(Java Virtual Machine)은 프로그램 실행 시 가장 먼저 main
메서드를 호출하여 프로그램을 시작합니다.
public static void main(String[] args) {
// 실행될 코드
}
- 구성 요소
public
: JVM이 외부에서 접근할 수 있도록 선언static
: 객체 생성 없이 호출 가능하도록 선언void
: 반환값이 없음String[] args
: 프로그램 실행 시 전달받는 매개변수 배열
2. static
키워드 간략 정리
static
은 자바에서 "클래스 수준의 멤버"를 정의할 때 사용하는 키워드입니다. 이를 통해 해당 필드나 메서드를 객체가 아닌 클래스에 귀속시킬 수 있습니다.
2.1 static
의 특징
- 클래스 로드 시점에 메모리에 할당
- 객체가 생성되지 않아도
static
멤버는 메모리에 올라갑니다.
- 객체가 생성되지 않아도
- 공유된 상태
static
멤버는 클래스의 모든 인스턴스가 공유합니다.
- 객체 생성 불필요
- 객체를 생성하지 않아도
클래스명.멤버
로 접근 가능합니다.
- 객체를 생성하지 않아도
2.2 static
의 용도
- 공통적으로 사용되는 유틸리티 메서드 (예:
Math.sqrt()
) - 프로그램 전역에서 공유해야 하는 상수 및 필드
3. main
메서드가 static
인 이유
main
메서드가 반드시 static
으로 선언되어야 하는 이유는 JVM이 프로그램 실행 시 객체를 생성하지 않고도 메서드를 호출해야 하기 때문입니다. 이를 단계적으로 살펴보겠습니다.
3.1 JVM의 동작 방식
- 자바 프로그램 실행 과정
- JVM은 프로그램을 실행할 때 클래스 파일을 로드합니다.
main
메서드를 찾아 호출합니다.- 이 시점에는 아직 객체가 생성되지 않았습니다.
- 객체를 생성하려면 생성자를 호출해야 하는데, 이 과정에서
main
메서드를 호출하려면 이미 객체가 있어야 하는 모순이 발생합니다.
3.2 객체 생성 없이 호출 가능
main
메서드가static
으로 선언되어 있기 때문에 JVM은 객체를 생성하지 않고도클래스명.main(args)
형태로 호출할 수 있습니다.- 예를 들어, 다음과 같이 실행됩니다
클래스명.main(args);
3.3 프로그램 진입점으로의 역할
- 프로그램 시작 시, 어떤 클래스든 객체를 생성하지 않고 고정된 진입점을 제공해야 합니다.
static
메서드는 클래스 로드만으로 호출 가능하기 때문에, JVM이 프로그램 실행을 시작하기에 적합합니다.
3.4 성능 및 효율성
static
을 사용하면 객체 생성에 필요한 메모리와 시간을 절약할 수 있습니다.- 프로그램 초기화 단계에서 객체 생성 비용을 최소화하여 실행 효율성을 높입니다.
4. 추가적으로 알아두면 좋은 점
4.1 만약 main
메서드가 static
이 아니라면?
- JVM은 실행 시 객체를 생성해야 하기 때문에 진입점으로 사용할 메서드를 찾는 과정에서 무한 루프 또는 에러가 발생할 수 있습니다.
- 따라서
main
메서드는 반드시static
으로 선언되어야 합니다.
4.2 다른 언어와의 비교
- C, C++에서는
main
함수가 전역 함수로 정의됩니다. 자바는 객체지향 언어이므로 모든 메서드가 클래스에 속해야 하지만,static
을 통해 전역 함수처럼 동작하게 만듭니다.
5. 결론
main
메서드가 static
인 이유는 간단합니다.
- JVM이 객체 생성 없이 프로그램을 시작할 수 있도록 하기 위해서입니다.
- 이로 인해 프로그램이 효율적이고 논리적으로 동작할 수 있는 환경이 마련됩니다.
자바에서 main
메서드가 단순히 프로그램의 시작점이 아니라, JVM과의 중요한 연결고리라는 점을 이해해야 합니다.
'BackEnd > JAVA' 카테고리의 다른 글
[JAVA] try-with-resources 정리 (0) | 2025.01.19 |
---|---|
[JAVA] 자바 부모클래스 및 인터페이스 심화: 오버라이딩과 메서드 동작 (0) | 2025.01.17 |
[JAVA] 인터페이스 정리 (0) | 2025.01.12 |
[JAVA] 추상 클래스 (Abstract Class) 정리 (0) | 2025.01.09 |
[JAVA] 접근 지정자 (Access Modifiers) 정리 (0) | 2025.01.06 |