Java에서 시작점의 역할을 하는 부분이 바로 main이고 main에서 실행하는데 있어 메인에서 다른 클래스 메소드 등을 호출해서 사용한다. 그렇기 때문에 main 자체가 다른곳에서 접근을 허용하지 않는다면 문제가 생길수 밖에 없기에 가장 넓은 범위로 접근을 허용하는public을 사용하는 것이다.
static을 명령어로 지정하는 이유는 static의 특징이 프로그램이 시작하면서 따로 인스턴스 하지 않아도 프로그램의 시작과 동시에 static으로 선언된 것들은 메모리에 반드시 올라가게 되는데, 다른 녀셕들과 다르게 프로그램이 종료되는 시점까지 계속 유지가 된다는 점이다. 다른 클래스, 메소드, 변수 등의 경우 사용 후 Java Virtual machine 의 GC에 의해 메모리에서 삭제가 되지만, static 으로 선언된 것은 끝까지 살아 남아 계속 참조를 할수 있는 특징이 있으므로, 프로그램의 시작과 끝을 함께하는 main 메소드가 계속 살아 남아 역할을 하기 위해서는 static 명령어가 꼭 필요 하다고 할수 있다.
staic은 반드시 메모리에 올라가며 GC의 대상이 되지 않는다. 객체를 다시 생성 한다고 해도 그 값은 초기화되지 않고 해당 클래스를 사용하는 모든 객체에서 공유하게 된다!
void를 사용하는 것은 main 자체가 하나의 프로그램의 시작과 끝인데, 프로그램 자체가 종료가 되는 시점에서 어떤 특정 값이 반환되어도 의미가 없기 때문에 void를 사용한다. 어떤 계산에 의한 값이 반환이 있다면 그건 프로그램 종료 되기 전에 이루어져야한다.
String[] args args의 이름은 얼마든지 다른 것들로 대체 가능하다. 또한, String args[] 도 가능하며, 사용 이유는 외부에서 값을 받아와서 프로그램 안에서 사용하고자 할때 메모리에 저장할 공간을 미리 선언해 두는 것이다. 예를 들면 Example.java 라는 이름으로 클래스를 생성하고 실행한다면 java Example.java 라는 명령어를 통해 실행이 되는데, java Example.java 100 200 이런식으로 맨 처음 프로그램을 실행하는 순간 특정 값을 입력하고자 할경우 사용한다. args[0], args[1] 에 저장이 되어 프로그램 안에서 사용 가능하다.
$ java Example.java hello