Java를 처음 배울 때 그냥 기계적으로 쓰던 문장. 이 문장이 무슨 뜻인지 하나씩 뜯어보도록 하겠습니다.
[public]
접근 지정자입니다. 접근 지정자로는 아래의 네 가지가 있습니다.
- public: 공용 멤버, 모든 클래스에서 사용 가능. 다른 패키지에서도 import를 통해 사용 가능.
- private: 전용 멤버, 해당 클래스에서만 사용 가능.
- protected: 보호 멤버, 해당 클래스 및 서브 클래스(상속받는 클래스)만 사용 가능.
- package: 패키지 멤버, 같은 패키지에서만 사용 가능. (접근 지정자를 명시하지 않으면 패키지 멤버가 됩니다.)
이 중에서 public을 사용한 것입니다.
자바 가상 머신 (Java Virtual Machine)이 main문에 접근하기 위해 public을 사용합니다.
[static]
정적 변수 및 메소드로 생성하는 키워드입니다.
main문의 경우 정적 메소드로 생성되었는데, 정적 메소드의 특징을 생각해보면 간단합니다.
객체의 생성 후에 생성되는 인스턴스 메소드와 달리, 정적 메소드는 객체의 생성 전에 이미 생성되어 사용할 수 있습니다.
이를 확인하기 위해서는 정적 메소드 내에 인스턴스 변수 및 메소드를 호출해 보면 됩니다.
정적 메소드 내에서 인스턴스 변수 및 메소드를 사용하면 에러가 발생하는데, 정적 메소드가 사용이 가능한 시점에 인스턴스 변수 및 메소드는 생성조차 안 되어 있기 때문입니다.
main문 역시 제일 먼저 시작되어야 하는 메소드, 즉 정적 메소드여야 하기 때문에 static으로 선언된 것입니다.
[void]
메소드의 타입을 나타내는 키워드입니다.
main문은 return값이 없으므로 void형으로 선언합니다.
[String[] args]
파라미터로 문자열을 받았습니다. 파라미터이기 때문에 이름은 무엇으로 설정하여도 상관이 없습니다.
main문을 실행할 때 외부의 값을 저장할 수 있게 하는 문자열 타입 배열입니다.
어디에 쓰는지 가장 직관적으로 이해가 안 될 수도 있습니다. 이해를 돕기 위해 아래에 코드를 작성하였습니다.
import java.util.Scanner;
// 주문을 넣는 클래스
public class Order {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("주문할 양을 입력하세요.");
int number = sc.nextInt();
sc.nextLine();
// 주문하는 메뉴를 담을 문자열 배열
String[] sl = new String[number];
System.out.println("주문할 메뉴를 입력하세요.");
for (int i = 0; i < number; i++) {
sl[i] = sc.nextLine();
}
System.out.println("주문 완료.");
System.out.println();
// 주문을 받는 클래스에 주문 목록을 넘김.
receiveOrder.main(sl);
}
}
// 주문을 받는 클래스
public class receiveOrder {
// 파라미터의 변수명은 무엇이어도 상관없으므로 이해를 돕기 위해 직관적으로 작명.
public static void main(String[] menuList) {
for (String menu : menuList) {
System.out.println("주문하신 " + menu + "을/를 준비하고 있습니다.");
}
System.out.println("주문해주셔서 감사합니다.");
}
}
위의 두 클래스를 실행해보거나 참고하면 어렵지 않게 이해할 수 있을 겁니다.
왜 main문을 저렇게 써야 하는지 길게 썼지만, 사실 아주 간단한 이유가 있습니다.
모든 언어에는 엔트리 포인트가 있습니다. 엔트리 포인트란 프로그램이 시작되는 시작점을 말합니다.
첫 줄부터 읽어오는 Python의 경우 엔트리 포인트는 첫 줄이 될 것이고, main문부터 시작하는 Java, C++은 main문이 엔트리 포인트가 됩니다.
그리고 Java에서는 public static void main(String[] args)만을 엔트리 포인트로 지정했기 때문에 main문을 다른 식으로 작성하면 실행 자체가 불가능하게 됩니다.
실제로 main문을 여러 형태로 오버로딩하여도 public static void main(String[] args)만이 시작점이 되는 것을 확인할 수 있습니다.
'프로그래밍 언어 정리 > Java' 카테고리의 다른 글
[Java] 컴파일 (0) | 2022.12.16 |
---|