자바로 구현된 프로그램이 시작될 때 가장 먼저 실행되는 메서드이다.
main 메소드 앞에는 static이 붙어있다. static이 붙은 클래스, 변수, 메소드는 자바 프로그램이 시작 될 때 인스턴스화가 되고 자바 프로그램이 종료 될 때 사라진다. 이 말은 시작할때부터 끝날때까지 계속 존재한다는 뜻이다.
static이 붙어 있지 않은 일반 클래스는 GC의 대상으로 필요할 때 new를 이용해 생성되고 사용이 끝나면 메모리 효율을 위해 GC가 메모리에서 없애버린다.
main 메소드는 static이 붙어있기 때문에 프로그램이 실행 될 때 만들어진다. 뿐만 아니라 main 메소드는 자바가 가장 먼저 실행하는 메소드이다. main 메소드가 없다면 자바가 실행되고 시작점을 찾지 못해 바로 종료된다.
프로그램의 시작점이다.
실행 가능한 코드를 포함한다.
main 메서드가 없으면 자바 프로그램은 실행될 수 없다.
public class Main{
// main 메서드
public static void main(String args[]){
}
}
main 메소드의 구성요소는 접근제어자, static인지 여부, 리턴타입, 메소드명, 매개변수로 총 5가지이다.

main 메소드에서 접근제어자는 크게 의미가 없다. 하지만 public으로 선언 되어야 하는 이유는 JVM에서 접근을 하기 때문이다. private으로 되어 있다면 실행을 할 수 없다.
main 메소드가 static인 이유는, 프로그램이 실행될 때 해당 클래스의 인스턴스를 생성하지 않고도 메소드에 접근할 수 있게 하기 위함이다.
Java 프로그램이 시작될 때, JVM은 main 메소드를 호출하여 프로그램을 실행합니다. 예를들어 PrivateMain 클래스가 Java 프로그램이 시작되는 시점에서 아직 인스턴스가 생성되지 않았기 때문에, main 메소드를 호출하기 위해선 main 메소드가 static이어야 합니다.
public class PrivateMain { // 에러 남
public void main(String[] args) {
System.out.println("private main");
}
}
public class PrivateMain { // 에러 안남
public static void main(String[] args) {
System.out.println("private main");
}
}
main 메소드를 호출하는 곳은 JVM이 유일하다. 호출도 단 한번만 된다. main 메소드의 용도는 자바 프로그램을 시작하는 시작점이기 때문이다. main메소드에서는 new를 이용해 다른 클래스의 인스턴스를 생성하고 다른 기능들을 실행하는 코드들이 대부분이다. 그래서 리턴값이 필요 없다. 따라서 리턴타입은 void로 고정한다.
main 메소드의 메소드명도 바꿀 수 없다. main이라는 이름을 가지고 이 메소드를 찾기 때문이다. main이 아닌 다른 이름으로 바꾸었을때 역시나 자바에서는 찾을 수 없다는 에러가 발생한다.
String[] args는 자바 프로그램을 실행 할 때 특정 값들을 전달 할 수 있는 매개변수이다. 프로그램은 한군데에서만 실행되기 위해 만들기도 하지만 프로그램을 판매 한다면 구매한 사용자들마다 개인의 설정값들(이메일 주소, DB 계정, URL, 비밀번호 등)을 바꿔주어야 할 필요가 있다.
이러한 설정값들은 소스코드를 수정하지 않고도 바꿀 수 있게끔 프로그램을 만들어야한다. 그래서 자바프로그램을 실행 할 때 설정값들을 넘겨줄 수 있고 프로그램을 실행할때 넘긴 값들은 main메소드의 String[] args로 넘어온다. args는 arguments의 줄임말로 함수나 호출시 전달되는 인수를 말한다.
- 프로그램의 시작점으로서, JVM은 main 메소드를 찾아서 실행한다.
- main 메소드는 프로그램의 로직을 구현하고, 다른 클래스나 메서드를 호출할 수 있다.
- main 메소드는 프로그램이 종료될 때까지 실행된다.
main 메소드는 자바 언어에서 규정한 표준 진입점이다. 이는 다른 프로그래밍 언어에서도 비슷한 개념으로 존재한다. 따라서 프로그램의 진입점을 명시해 주어야 하는 자바에서도 main 메서드가 필요하다.