본문 바로가기

프로그래밍 언어 정리/Java

[Java] public static void main(String args[])

Java를 처음 배울 때 그냥 기계적으로 쓰던 문장. 이 문장이 무슨 뜻인지 하나씩 뜯어보도록 하겠습니다.

 


[public]

 

접근 지정자입니다. 접근 지정자로는 아래의 네 가지가 있습니다.

 

  1. public: 공용 멤버, 모든 클래스에서 사용 가능. 다른 패키지에서도 import를 통해 사용 가능.
  2. private: 전용 멤버, 해당 클래스에서만 사용 가능.
  3. protected: 보호 멤버, 해당 클래스 및 서브 클래스(상속받는 클래스)만 사용 가능.
  4. 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