1 minute read

main() 메서드란?

  • 모든 Java 애플리케이션의 도입 지점이다.
  • Java 애플리케이션을 시작하는 모든 초기 작업을 수행하는 역할을 한다.
    • 애플리케이션 클래스들의 초기화, DB 연결 등이다.
  • JVM이 애플리케이션 메서드들 중 가장 먼저 실행하는 메서드이기도 하다.

main() 메서드의 특징

  • main 메서드는 Java 애플리케이션에서 필수다. 없으면 Java의 애플리케이션 자체가 실행되지 않는다.
  • main 메서드의 구조인 “public static void main(String[] args)” 중 어느 하나라도 변하면 JVM이 인지할 수 없다.

static으로 선언된 이유

  • 어떤 클래스의 인스턴스에 의존하지 않고도 Java 애플리케이션을 실행할 수 있다.
    • static 메서드는 클래스 자체에 속하기 때문에 인스턴스에 의존하지 않기 때문이다.
    • Java의 인스턴스 생성은 Java 애플리케이션이 실행되고 나서야 가능하기 때문에 static으로 하여 인스턴스에 대한 의존성을 제거한 것이다.
  • JVM의 책임과 애플리케이션의 책임을 분리하는 역할을 한다.
    • JVM은 애플리케이션 코드가 실행되기 전에 코드가 실행될 기반을 조성하는 역할을 한다.
      • Java의 요소들(객체, static 요소들 등)을 위한 메모리 공간 확보, GC 구동, ClassLoader 로딩 등의 작업이 이뤄진다.
    • 애플리케이션은 프로그램의 비즈니스 로직, 데이터를 다룬다.
    • main()이 static이 아니라면 JVM가 main()을 실행하기 위해 인스턴스를 만들어야 한다. 인스턴스의 생성은 JVM이 아닌 애플리케이션의 역할이다. 서로의 이해관계가 분리되지 않는다.
  • main이 static이 아니라면 역설적인 문제가 발생한다.
    • 애플리케이션을 실행하려면 메인 클래스(애플리케이션 클래스)의 인스턴스가 필요하다.
    • 인스턴스가 존재하려면 애플리케이션이 실행되어야만 한다.
    • 서로 모순되는 상황이 발생한다.

➕Java 애플리케이션이 실행되는 과정

  • 애플리케이션이 가동된다.
  • JVM이 .class에 있는 클래스와 메인 클래스를 메모리에 로딩한다.
    • 메인 클래스 = main 메서드를 지닌 클래스
    • 애플리케이션에 있는 클래스들은 로딩되지 않음에 주의한다.
  • JVM이 사전 작업을 수행한다. 클래스의 바이트코드 값의 유효성 검사, static 멤버들의 초기화 등이 이뤄진다.
  • JVM이 main() 메서드를 찾고 실행한다.
  • main() 메서드가 애플리케이션 클래스의 인스턴스를 생성하고 초기 설정(환경 프로퍼티 설정, DB 연결 등)을 수행한다. JVM은 여전히 가동 중이며, 메모리를 관리하거나 Garbage Collection 등을 한다.

Categories:

Updated: