[JAVA] 자바에서 main 메서드가 static인 이유

2025. 1. 6. 10:23·BackEnd/JAVA

자바를 처음 배우면 가장 먼저 접하는 메서드가 바로 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의 특징

  1. 클래스 로드 시점에 메모리에 할당
    • 객체가 생성되지 않아도 static 멤버는 메모리에 올라갑니다.
  2. 공유된 상태
    • static 멤버는 클래스의 모든 인스턴스가 공유합니다.
  3. 객체 생성 불필요
    • 객체를 생성하지 않아도 클래스명.멤버로 접근 가능합니다.

2.2 static의 용도

  • 공통적으로 사용되는 유틸리티 메서드 (예: Math.sqrt())
  • 프로그램 전역에서 공유해야 하는 상수 및 필드

3. main 메서드가 static인 이유

main 메서드가 반드시 static으로 선언되어야 하는 이유는 JVM이 프로그램 실행 시 객체를 생성하지 않고도 메서드를 호출해야 하기 때문입니다. 이를 단계적으로 살펴보겠습니다.

3.1 JVM의 동작 방식

  • 자바 프로그램 실행 과정
    1. JVM은 프로그램을 실행할 때 클래스 파일을 로드합니다.
    2. main 메서드를 찾아 호출합니다.
    3. 이 시점에는 아직 객체가 생성되지 않았습니다.
  • 객체를 생성하려면 생성자를 호출해야 하는데, 이 과정에서 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) 정리  (1) 2025.01.06
'BackEnd/JAVA' 카테고리의 다른 글
  • [JAVA] 자바 부모클래스 및 인터페이스 심화: 오버라이딩과 메서드 동작
  • [JAVA] 인터페이스 정리
  • [JAVA] 추상 클래스 (Abstract Class) 정리
  • [JAVA] 접근 지정자 (Access Modifiers) 정리
개발자 동긔
개발자 동긔
배우고 느낀점들을 기록합니다. 열정 넘치는 백엔드 개발자로 남고싶습니다.
  • 개발자 동긔
    Donker Dev
    개발자 동긔
  • 전체
    오늘
    어제
    • Category (39)
      • BackEnd (23)
        • JAVA (15)
        • Spring & JPA (7)
      • Database (4)
      • Computer Science (2)
        • Network (0)
        • Security (0)
        • Web (1)
      • DevOps (6)
        • Docker (1)
        • Jenkins (0)
        • Monitoring (2)
        • CICD (1)
      • 트러블 슈팅 (3)
      • 성능 개선 (1)
      • Project (0)
  • 인기 글

  • 태그

    restful api
    docker compose
    spring boot
    CICD
    mysql master/slave replication
    @RequestBody
    restful api 설계
    spring cloud msa
    Database
    인터페이스
    와일드카드
    JPA
    Jenkins
    master/slave db 이중화 처리
    interface
    docker
    java
    nginx
    Spring
    SSH
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
개발자 동긔
[JAVA] 자바에서 main 메서드가 static인 이유
상단으로

티스토리툴바