이번 포스팅에서는 java 공부를 하면서 제가 중요하게 생각하고 있는 개념인 main method의 동작을
JVM과 메모리의 관점에서 알아보려고 합니다.
1. 역활
먼저 java에서 main method의 역활에 대해서 알아보겠습니다.
method는 직역하면 '함수'이며, 함수는 다수의 값을 입력 받을 수 있고 내부 로직으로
입력값을 처리하여 단 하나의 결과값을 반환하는 역활을 합니다.
(또는 결과값이 없을 수도 있습니다.)
그 중에서도 main method는 java로 작성된 코드를 실행시켜주는 JVM (Java Virtual Machine) 이
최초로 실행하는 method인데요.
그렇기 때문에 만약 코딩 할 때 main method를 작성하지 않게 된다면 JVM은 코드를 실행시킬 수 없습니다.
즉, main method는 프로그램을 실행시켜주는 역활을 하고있습니다.
2. 분석
2.1 접근제어자
이런 개념을 토대로 main method의 동작을 구체적으로 파헤쳐보겠습니다.
[예제소스]
java의 모든 로직은 class 내부에서 정의하여 사용하는데 main method 또한 class내부에 정의되며 필요에 의하여
'접근 제어자' 라는 것이 반드시 붙게 됩니다.
접근 제어자란 variable, class, method로 접근하는것을 제어하는 역활을 하는 명령어인데요.
비유적으로 표현한다면 주택의 보안을 맡아주시는 경호원의 역활과 유사합니다.
접근 제어자는 public, protected, default(생략), private 등이 있으며 간략한 정의는 아래와 같습니다.
- test class, main method의 'public' 접근제어자
main method가 정의된 class는 public 접근제어자를 사용해야 JVM이 main method에 접근 할 수 있기 때문에
반드시 public으로 선언해야하며, main method도 마찬가지 이유로 인하여 public으로 선언해야합니다.
- main method의 'static' 접근제어자
위에서 static 접근제어자에대해 간략하게 언급하였듯 static 접근제어자는 메모리의 공유를 위해서 사용하는
접근제어자인데 static으로 선언된 variable 또는 method의 경우프로그램이 최초 실행시 메모리에 할당 된 상태로
실행이되며, 프로그램이 종료 될 때 메모리에서 소멸됩니다.
조금 더 쉽게 풀어쓰면 프로그램이 실행 될 때 미리 메모리에 할당되며, 어떤 영역에서든 필요시에 메모리에서
가져다 쓸 수 있는 것입니다.
(이는 객체를 필요시마다 생성 및 소멸을 반복하는 과정과 상반되는 동작입니다.)
따라서 main method의 접근제어자인 public과 static은
JVM의 접근과 실행을 위해서 반드시 필요한 접근제어자인것입니다.
2.2 method
그 다음은 main method의 반환타입과 입력타입인데요. java에서 메소드를 정의하는 형식은 다음과 같습니다.
[ method 정의 형식 ]
첫 번째의 자료형은 method에서 반환하는 자료형(=data type)을 명시하는것이며 main method는
JVM에게 반환하는 값이 없기 때문에항상 void (=반환값이 없다는 의미의 예약어) 를 사용해야합니다.
두 번째의 자료형은 method를 호출 시 입력받는 값(=전달인자)을 저장하는 매개변수(parameter) 의 자료형이며,
사용자로부터 입력받은 값의 자료형은 항상 문자열 (Sting)이기 때문에 문자열을 요소로 가지는 배열을
사용해야합니다.
마지막으로 매개변수명으로 args (argument)를 사용하는 이유는 암묵적인 약속으로 지정된 것이며
다른 명칭으로도 사용이 가능하나, 코드의 가독성을 위해서 args로 사용하는것을 추천드립니다.
3. 참고
main method의 정의는 다양한 개념이 혼합되어 있어서 한번에 이해하기 어려운 부분이 있기 때문에
가볍게 개념을 잡은 상태에서 시간을 가지고 꾸준히 학습하시는것을 추천드립니다.
최대한 정확한 정보를 공유하고자 항상 신중하게 포스팅을 하고 있지만,
내용에 개선이 필요한 부분이 있을 수 도 있습니다.
혹시나 추가적인 보완이 필요하다고 판단되는 부분이 있다면 댓글로 조언해주세요.
참고하여 수정해놓겠습니다.
* 해당 포스팅이 도움이되셨다면 공감과 댓글 부탁드릴께요 ㅎㅎ
'Computer Language > Java' 카테고리의 다른 글
[파헤치기] java 객체 생성문의 개념 (0) | 2018.11.11 |
---|---|
[파헤치기] GUI Swing : getContentPane() 동작의 흐름 (1) | 2018.09.23 |
동등 비교 연산자( == )와 메소드( equals() ) [개념 및 차이점] (0) | 2018.09.18 |
[파헤치기] Library vs Framework (+API) 개념의 이해 (0) | 2018.08.04 |