왜 main()는 public static void인가?
자바에서 main()
는 뭘까? 너무나 당연하게 그 자리에 있어서 이것이 특별한 메서드라는 생각조차 하지 않게 된다. main()
는 자바 프로그램의 시작점이다. main()
은 다른 메서드와 다르게 그 자리에서 실행해볼 수 있다. 좋다. 그런데 어떻게 이런 일이 가능해지는 걸까? 이름 빼고 선언부가 완전히 같은 다른 메서드를 정의해도 그것을 main()
를 거치지 않고 실행하기란 불가능하다.
왜 public인가?
우리는 IDE의 Java Application Run
으로 프로그램을 실행하는데 익숙하다. 이는 프로그램을 실행하는 주체가 main()
이라고 착각하게 만든다. 하지만 잘 알다시피 프로그램을 실행하는 것은 main()
이 아니라 JVM이다. 우리는 단지 main()
위에서 Run
버튼을 눌렀을 뿐이지만 어디선가는 이런 일이 일어날 것이다.
- JVM을 실행한다.
- 실행된 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 |