정의
-
자바 메인 메서드는 JVM(자바 가상 머신)이 프로그램을 실행할 때 가장 먼저 찾아가 호출하는, 약속된 진입점(Entry Point)이다.
-
JVM은 약속된 규격의 메서드를 찾아 프고그램의 생명주기를 시작한다.
-
표준 규격 : public static void main(String[] args)
자바 메인 메서드의 중요성
만약 메인 메서드라는 규격화된 약속이 없다면 어떻게 될까? 수천 개의 파일로 이루어진 거대한 소프트웨어에서 컴퓨터는 어디서부터 코드를 읽어야하는지 알 수가 없게 된다. 개발자마다 시작하는 메서드 이름을 start(), run(), init() 등으로 제멋대로 지었다면, 실행할 때마다 시작점을 알려줘야 하는 번거로움과 시스템의 불안정성을 감당해야 했을 것이다. 메인 메서드는 이 시작의 표준화를 통해 시스템의 복잡성을 해결한다.
메인 메서드의 의미
- public (가장 높은 접근 수준)
JVM은 우리가 짠 코드의 외부에 존재하는 실행 환경이다. 외부에서 내부의 시작 버튼을 누르려면 당연히 접근이 완전히 개방(public)되어 있어야 한다.
- static (애초부터 존재하는 형태)
클래스가 메모리에 로드될 때 같이 로드된다. 시작 버튼(main)을 누르기 위해 객체을 먼저 new해야 한다면 모순일 것이다. 그래서 조립 없이도 누를 수 있는 고정된 벽면 스위치처럼 만드는 것이 static이다.
- void (리턴값 없음)
메인 메서드의 실행이 끝났다는 것은 곧 프로그램의 종료를 의미한다. 프로그램이 죽으면서 무언가 값을 남겨봤자, 자바 프로그램 내부에서는 그걸 받아줄 대상이 더 이상 존재하지 않기 때문에 반환값이 필요 없는 것이다.
- String[] args (외부 파라미터)
실무에서는 주로 서버를 띄울 때 "개발 환경인지 운영 환경인지" 혹은 "몇 번 포트로 실행할 것인지" 등의 초기 설정값을 외부에서 주입할 때 이 외부 파라미터를 유용하게 사용한다. (예: java MyApp 8080 production 이라고 치면 args[0]에는 "8080", args[1]에는 "production"이 들어온다.)
동작 원리
- 개발자가
java MyProgram이라는 명령을 내리면 JVM은 해당 클래스 파일 내에서 정확히 public static void main(String[] args)라는 서명을 가진 메서드를 찾는다.
- 명령 전달 : 사용자가
java MyProgram 명령을 내린다.
- JVM 가동 : 자바 가상 머신이 실행되면 메모리를 할당받는다.
- 클래스 로딩 :
MyProgram 클래스 파일을 메모리에 올린다.
- 약속된 이름 찾기 : JVM은 해당 클래스 내에서
public static void main(String[] args)라는 서명을 가진 메서드를 검색한다.
- 실행 : 메인 메서드가 호출되며 프로그램의 생명 주기가 시작된다.