0. 들어가며
public class Test {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
자바를 처음 배우면 대개 위와 같은 문장을 따라 쳐 보는 것으로 시작하곤 합니다. 또한 자바 프로그래밍을 하다보면 수없이 사용하는 문장임에도 불구하고 자세히 알아본 적이 없는 것 같아 이번 기회에 이에 대해 정리해보려 합니다.
1. 본문
public static void main(String[] args)
위 문장에 대해 알아본다라는 것은 크게 세 가지를 알아본다라고 정리할 수 있을 것 같습니다.
1. main 메소드는 무엇인가?
2. main 메소드의 매개 변수인 String[] args는 무엇인가?
3. main 메소드는 왜 public static void 이어야 하는가?
1 ) main 메소드는 무엇인가?
자바에서 main 메소드는 JVM이 자바 프로그램을 실행시킬 때 최초로 실행시키는 메소드입니다.
따라서 main 메소드를 작성하지 않게 된다면 JVM은 코드를 실행시킬 수 없습니다.
다수의 프로그래밍 언어(C, C++, Java)에서 엔트리 포인트로써 main 함수를 사용하고 있습니다.
반면에 스크립트 언어(Python, JavaScript)의 경우 인터프리터가 코드를 읽기 시작한 부분부터 진행이 됩니다.
2 ) main 메소드의 매개 변수인 String[] args는 무엇인가?
보이는 그대로 args는 String 클래스 타입의 배열에 대한 변수명입니다. args의 경우 변수명에 불과하기 때문에 이를 다른 단어로 바꾸어도 프로그램 실행에는 지장이 없습니다. 하지만 코드 가독성을 위해 args 변수명은 변경하지 않는 것이 좋다고 생각합니다.
커맨드 라인에서 자바 파일을 실행시킬 때
java [FileName] String1 String2 String3
위와 같이 문자열들을 공백으로 구분하여 입력 후 실행시켜주면 args 배열에 들어가게 되고 이 값을 토대로 main 메소드 내부의 로직을 진행하는 데 사용할 수 있습니다.
3 ) main 메소드는 왜 public static void 이어야 하는가?
1. public
main 메소드의 접근 제어자는 public입니다.public 접근 제어자를 사용할 경우 어디에서나 해당 메소드에 접근이 가능하게 됩니다. 즉, main 메소드를 어디에서나 접근 가능하게 만들고 싶다라는 의도를 가지고 있습니다. 그렇게 만든 이유는 클래스 밖, 패키지 밖에 있는 JVM이 main 메소드를 정상적으로 호출할 수 있도록 하기 위해서입니다!
2. static
static은 인스턴스를 생성하지 않고도 메소드를 호출할 수 있도록 도와주는 제어자입니다.
static 제어자를 통해 JVM은 해당 클래스의 인스턴스를 생성하지 않고도 main 메소드를 호출 할 수 있게 됩니다. JVM이 오직 main 메소드만을 호출하기 위해 인스턴스를 생성하는 것은 불필요한 메모리 낭비가 될 수 있습니다.
따라서 main 메소드를 static 메소드로 만들어 JVM을 실행할 때 메모리에 올려두고 바로 접근하는 것입니다.
3. void
main 메소드의 리턴타입이 void 라는 의미입니다. 즉, main 메소드의 리턴값이 없다는 것입니다. main 메소드의 리턴값은 int 일 수도 String 여도 될 것만 같습니다. 그렇지만 리턴 타입이 void인 이유는 다음과 같습니다.
자바 프로그램은 main 메소드 위에서 실행되고 결국 마지막에 main 메소드만 남게 됩니다. 즉, main() 에서 시작하여 main() 으로 끝나는데 main()함수가 끝나면 자바 프로그램 역시 끝나게 됩니다. 즉, JVM이 main() 함수의 리턴 값을 가지고 무언가를 하는 게 없기 때문에 굳이 리턴 값이 필요 없는 상황인 것입니다.
main()은 운영체제의 프로세스가 아닌 JVM의 메인 스레드를 사용하고 운영체제의 프로세스를 사용하는 것은 JVM이므로 main()이 종료되었다는 상태를 반환하지 않아도 됩니다.
아래는 제가 직접 return 값을 void가 아닌 int로 실험해본 코드이고 결과는 다음 사진과 같은 에러가 발생합니다.
2. 나가며
자바를 배우다 보면 정말 많이 쓰게 되는 public static void main에 대해 글을 써보았습니다.
항상 당연하게 여기며 썼던 코드에 대해 알아보고 나니 모든 것에는 그렇게 만들고 쓰는데 이유가 있다는 생각을 다시 한번 하게 되는 것 같습니다. 또 이러한 부분에 대해 공부해보면 배울 것이 많다는 생각이 듭니다.
공부하며 작성하는 글이다 보니 정확한 내용을 쓰기 위해 노력하긴 했지만 틀린 내용이 있을 수도 있습니다. 지적해주시면 도움이 많이 될 것 같습니다!
'Java & Kotlin' 카테고리의 다른 글
[Java] ArrayList는 어떻게 크기가 가변적일까? (2) | 2022.02.23 |
---|---|
[Java] Garbage Collection(GC)에 대하여. (0) | 2022.02.16 |
[Java] JVM에 대하여. (0) | 2022.02.15 |
[Java]✏️마커 인터페이스에 대하여. (1) | 2022.02.12 |
[Java] 왜 부모 클래스의 참조 변수가 자식 클래스의 메소드를 사용하지 못할까? (1) | 2022.02.12 |