신경도 안쓰고 습관적으로 썼던 애플리케이션을 실행시켜주는 main 메서드를 분석한다.
[자바 작동방식]
자바 개발 키트(jdk)를 이용해
자바 언어로된 소스코드(.java)를 작성하고
그것을 JAVAC가 컴파일해준다.
결과 자바 바이트 코드(.class파일)로 변환이 되는데
이러한 바이트 코드를 JVM으로 로딩한후
JVM의 Execution Engine을 통해
각 CPU와 OS에서 실행가능하도록 해석해준다
main 메서드
프로그램이 실행되는중
자바 SE 공식 문서에 따르면
https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.2
/*
(자바 공식 문서 모아놓으신 분이 계시다 감사하다)
https://velog.io/@dev-mage/java-official-documents-list
*/
JVM은 소스코드중에서 main 메서드를 찾아서 가장먼저 실행하게 되는데
이것이 보통 java를 공부할때 가장먼저 보게 되는 "그 부분"이다.
public class HelloworldTest {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
위 코드와 같이 항상 왜 main 메서드는 이렇게 사용해야하는가?
궁금했던걸 오늘 알아봤다.
단순히 문법대로 해석해보면 되는 거였다.
위의 코드를 보면
main 메서드에 여러가지 것들이 붙어있다.
public static void
차례대로 확인해보자.
public
앞선 자바 SE 공식 문서에서 말했듯이 JVM이 main 메서드를 찾아와야 하므로
가장 먼저 접근제한이 없는 public을 사용해야한다.
접근제한자로 private를 사용할 시 JVM에서 main 메서드에 접근을 할 수가 없게 된다.
코드 1-1
package dd1;
public class test22 {
private void test1() {
System.out.println("qq");
}
}
코드 1-2
import dd1.test22;
public class HelloworldTest {
public static void main(String[] ad) {
test22 a = new test22();
a.test1();
}
}
public이 아닌 private를 사용시
위의 코드 1-1와 1-2같이 연계되지 않고 에러가 난다.
코드 1-3
package dd1;
public class test22 {
public void test1() {
System.out.println("qq");
}
}
위의 코드 1-3과 같이 test1 함수의 접근제한자를 public으로 변경해준다면 제대로 동작한다.
static
static을 사용할시 클래스의 인스턴스인 객체를 생성하지 않고 모두가 공유할 수 있게 된다.
//(메모리에 한자리를 내주는 것이다. 그러므로 자주 사용하는 것은 메모리 낭비를 하게 될 것이다.)
main이 있는 public 클래스에 접근해 public으로 접근제한자가 걸린 main 메서드를
static으로 인해 인스턴스 생성 없이 사용할 수 있는 것이다.
예를 들어 아래의 코드 2-1과 같이 static없이
객체도 생성하지 않고 메서드를 사용하려 한다면 에러가 난다.
코드 2-1
public class HelloworldTest {
public void test1() {
System.out.println("qq");
}
public static void main(String[] ad) {
System.out.println("Hello world!");
test1();
}
}
메서드를 사용하고 싶다면
코드 2-2와 같이 객체를 생성하거나
코드 2-3과 같이 static을 사용해 class 내부에서 메서드만 호출해 사용하거나
코드 2-4와 같이 static을 사용해 객체없이 class.메서드 형식으로 호출해 사용할 수 있다.
코드 2-2
public class HelloworldTest {
public void test1() {
System.out.println("qq");
}
public static void main(String[] ad) {
System.out.println("Hello world!");
HelloworldTest a = new HelloworldTest();
a.test1();
}
}
코드 2-3
public class HelloworldTest {
public static void test1() {
System.out.println("qq");
}
public static void main(String[] ad) {
System.out.println("Hello world!");
test1();
}
}
코드 2-4
public class HelloworldTest {
public static void test1() {
System.out.println("qq");
}
public static void main(String[] ad) {
System.out.println("Hello world!");
HelloworldTest.test1();
}
}
void
main은 return값이 필요없는 메서드이므로 void를 붙이게 된다.
main 메서드가 종료되면 더이상 할 일이 없기 때문에 당연히 return이 필요 없는 것이다.
return값이 필요한 메서드를 사용하는 경우는 아래의 코드 3-1과 코드 3-2와 같다.
코드 3-1
package dd1;
public class test22 {
public int test1() {
int result = 1+3;
return result;
}
}
코드 3-2
import dd1.test22;
public class HelloworldTest {
public static void main(String[] ad) {
test22 a = new test22();
int result=a.test1();
System.out.println(result);
}
}
추가로 main 메서드의 안에 String[] args라는 매개변수(파라미터)가 있는데
args는 단순히 매개변수의 줄임말인 변수명이므로 변경해도 아무문제가 없다.
그러나 매개변수 String[] args 자체를 없애면 컴파일만 되고 실행되지는 않는데
String[] args라는 매개변수로써 string배열 형식으로 사용자의 입력값을 전달하는 역할이기 때문이다.
//참고자료
https://www.geeksforgeeks.org/java-main-method-public-static-void-main-string-args/
https://www.javatpoint.com/java-main-method
잘못된 정보 말씀해주시면 수정합니다. 읽어주셔서 감사합니다.
'자바 공부' 카테고리의 다른 글
StringTokenizer 정리 (0) | 2022.10.05 |
---|---|
StringBuilder 정리 (0) | 2022.09.29 |
BufferedReader 정리 (0) | 2022.09.28 |