Java

왜 main()는 public static void인가?

voider 2021. 2. 9. 10:51

왜 main()는 public static void인가?


자바에서 main()는 뭘까? 너무나 당연하게 그 자리에 있어서 이것이 특별한 메서드라는 생각조차 하지 않게 된다. main()는 자바 프로그램의 시작점이다. main()은 다른 메서드와 다르게 그 자리에서 실행해볼 수 있다. 좋다. 그런데 어떻게 이런 일이 가능해지는 걸까? 이름 빼고 선언부가 완전히 같은 다른 메서드를 정의해도 그것을 main()를 거치지 않고 실행하기란 불가능하다.

왜 public인가?

우리는 IDE의 Java Application Run으로 프로그램을 실행하는데 익숙하다. 이는 프로그램을 실행하는 주체가 main()이라고 착각하게 만든다. 하지만 잘 알다시피 프로그램을 실행하는 것은 main()이 아니라 JVM이다. 우리는 단지 main() 위에서 Run버튼을 눌렀을 뿐이지만 어디선가는 이런 일이 일어날 것이다.

  1. JVM을 실행한다.
  2. 실행된 JVM에게 우리가 Run버튼을 눌렀던 위치에 있는 main()를 실행하라고 명령한다.

여기서 main()는 왜 public이어야 하는가?라는 질문에 답을 찾을 수 있다. 2번 명령을 수행하기 위해 클래스 밖에, 패키지 밖에 존재하는 JVM이 main()에 접근할 수 있어야 하기 때문이다

왜 static인가?

static이 아니면 무엇이어야 할까? main()이 일반 메서드라고 상상해보자. JVM은 main()에 접근하기 전에 인스턴스를 생성(new) 해야 한다. 메서드를 가지고 있는 객체의 참조를 모르고서 그 메서드에 접근할 방법이 없기 때문이다. JVM이 실행하고 싶은 것은 main()다. static메서드로 만들어 JVM을 실행할 때 메모리(Method Area)에 올려두고 바로 접근하면 그만이다. static을 쓰면 코드가 더 길어진다는 이유로 거추장스러운 단계를 추가할 이유가 없다.

왜 void인가?

String일 수도 있고 Object일 수도 있는데 왜 void여야 할까? 자바 프로그램은 main() 위에서 실행된다. main() 내에 정의된 명령을 수행하고 나면 프로그램은 종료된다. 이미 말했듯이 main()은 프로그램의 시작점이다. 그럼 프로그램이 종료하는 지점, 도착지는 어디일까? main()의 모든 명령을 실행하고 나면 다시 main()만 남는다. main()에서 시작해서 main()에서 끝난다. main()이 반환하는 값을 사용할 어떤 것도 남아있지 않다. int를 반환하여 작업이 끝난다는 것을 명시적으로 알릴 수도 있지만 굳이 그럴 이유가 없다. main()은 운영체제의 프로세스가 아닌, JVM의 메인 스레드를 사용한다. 운영체제의 프로세스를 사용하는 것은 JVM이므로 main()는 종료 되었다는 상태를 반환하지 않아도 된다.

왜 main인가?

main이라는 이름은 JVM이 식별할 수 있는 키워드다. 만약 메서드 이름이 아니라면 정해진 형식으로 기본 메서드를 정의하라는 메시지를 띄운다.

Error: Main method not found in class, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

따라서 반드시 메인 메서드의 이름은 main이어야 한다.

String[] args

선언된 파라미터를 가변 인자 String...로 바꾸거나 변수 이름을 바꾸는 것은 상관없다. 하지만 타입을 다른 타입으로 바꿀 수는 없다. 가변 인자야 내부적으로 배열을 사용하기 때문에 상관없지만, 타입을 바꾸는 것은 오버로딩이다. JVM은 정해진 형식의 main()만 식별하므로 사용할 수 없다.

그런데 왜 많은 타입 중에 String일까? 프로그램마다 여러 입력이 존재할 수 있다. 사용자의 입력에 따라 다른 결과를 돌려줘야 한다. 프로그래머 입장에서 사용자의 입력을 판별하기에 String타입이 가장 직관적이다. 또 하나의 입력이 아니라 한 번에 여러 개의 입력이 존재할 수 있으니 String[]으로 설정한 게 아닌가 싶다.

참고

Understanding public static void main(String[] args) in Java

'Java' 카테고리의 다른 글

call by value  (0) 2022.09.14
[Java]Exception  (0) 2021.02.07
8주차 - 인터페이스  (0) 2021.01.08
7주차 - package, import, classpath, 접근 제어자(access modifier)  (0) 2021.01.02
다이나믹 디스패치, 더블 디스패치  (0) 2020.12.26