언어 및 도구들 공부/Java

Java 에서의 public 클래스와 main 메소드 2

Dr.Mlem 2024. 9. 23. 12:50

Q4.

궁금한게, public 클래스가 아닌 클래스들은, 각각의 클래스 안에 여러 main 메소드들을 가질 수 있는거야?



아니요, 각 클래스는 public이든 아니든 상관없이 main 메소드를 여러 개 가질 수 없습니다. 즉, 하나의 클래스 안에는 오직 하나의 main 메소드만 존재할 수 있습니다.

이유:

  • 메소드 시그니처에 따라 Java에서는 메소드를 구별합니다. main 메소드의 시그니처는 public static void main(String[] args)로 정해져 있습니다.
  • 동일한 시그니처를 가진 메소드를 여러 개 정의하면 컴파일러는 중복 정의 오류를 발생시킵니다. Java에서는 동일한 이름과 동일한 매개변수를 가진 메소드를 중복으로 정의할 수 없기 때문입니다.

예시로 잘못된 경우:

class AnotherClass {
    public static void main(String[] args) {
        System.out.println("Main method 1");
    }

    public static void main(String[] args) {
        System.out.println("Main method 2");
    }
}

위 코드에서는 AnotherClass 안에 두 개의 main 메소드가 정의되어 있는데, 이는 시그니처가 동일하기 때문에 컴파일 오류가 발생합니다.

예시로 올바른 경우:

다만, 오버로딩을 통해 매개변수가 다른 main 메소드를 정의하는 것은 가능합니다. 즉, 매개변수 리스트가 다르면 메소드를 여러 개 정의할 수 있습니다.

jclass AnotherClass {
    public static void main(String[] args) {
        System.out.println("Main method with String[]");
    }

    public static void main(int[] args) {
        System.out.println("Main method with int[]");
    }
}

위 예제에서는 두 개의 main 메소드가 있지만, 하나는 String[] args를 받고, 다른 하나는 int[] args를 받습니다. 이런 식의 메소드 오버로딩은 허용됩니다. 하지만 프로그램을 실행할 때 JVM은 항상 String[] args 형태의 main 메소드를 찾아 실행하므로, 위 코드에서 실행되는 것은 첫 번째 main 메소드입니다.

요약:

  1. 한 클래스에는 동일한 시그니처의 main 메소드를 여러 개 정의할 수 없습니다. (String[] args 형태의 main은 하나만 가능)
  2. 오버로딩된 형태로 매개변수가 다른 main 메소드는 여러 개 가질 수 있습니다, 하지만 이 경우 JVM은 기본적으로 String[] args 형태의 main 메소드만 실행합니다.

이 내용이 질문에 답이 되었나요? 추가로 궁금한 점이 있으면 언제든 물어보세요!



Q5.

public 클래스에는 오버로딩을 위해서 여러 main 메소드를 가지면 안되는거야?



public 클래스에도 오버로딩된 main 메소드를 여러 개 가질 수 있습니다, 하지만 중요한 점은 오버로딩된 main 메소드들 중 JVM이 프로그램을 실행할 때 호출하는 것은 String[] args를 매개변수로 받는 main 메소드라는 점입니다. 나머지 오버로딩된 main 메소드들은 단순히 다른 메소드로 취급될 뿐, 프로그램의 진입점이 되지는 않습니다.

요약하자면:

  1. public class 안에서 main 메소드를 오버로딩할 수 있습니다.
    • 오버로딩이란 메소드 이름은 같지만, 매개변수의 종류나 개수가 다른 메소드를 정의하는 것을 말합니다.
    • 따라서, 여러 main 메소드를 정의할 수 있는데, 그중 매개변수가 다른 여러 main 메소드를 가질 수 있습니다.
  2. 하지만 JVM은 오직 public static void main(String[] args) 형태의 main 메소드를 프로그램 실행의 진입점으로 사용합니다.
    • 만약 다른 시그니처의 main 메소드가 있다면, 이는 단순히 일반 메소드로 취급되며, 직접 호출해야 합니다.

예시:

java
 
public class MyApp {
    // JVM이 실행하는 진입점 main 메소드
    public static void main(String[] args) {
        System.out.println("Main method with String[]");
        main(10);  // 오버로딩된 main 메소드 호출
    }

    // 오버로딩된 main 메소드
    public static void main(int args) {
        System.out.println("Main method with int");
    }
}

위 예제에서는 main(String[] args)와 main(int args) 두 가지 main 메소드가 있습니다.

  • 프로그램이 실행될 때 JVM은 항상 main(String[] args)를 실행합니다.
  • main(int args)는 오버로딩된 메소드로, 직접 호출해야만 실행됩니다. 위 코드에서는 main(String[] args) 안에서 main(10)을 호출하여 오버로딩된 main 메소드를 실행하고 있습니다.

결론:

  1. public 클래스에도 여러 main 메소드를 오버로딩할 수 있지만, JVM이 직접 호출하는 것은 String[] args 형태의 main 메소드입니다.
  2. 다른 형태의 오버로딩된 main 메소드는 일반 메소드처럼 직접 호출해야 합니다.

이해에 도움이 되었나요? 추가 질문이 있으면 언제든지 물어보세요!



Q6.
결국 String[] args 형태의 main 메소드가 아닌 main 메소드들을 직접 호출해야 하는 상황이기 때문에, 굳이 main 메소드들을 여러개 가질 이유가 없는거네?



맞습니다! 정확하게 이해하셨습니다. 결론적으로, String[] args 형태의 main 메소드를 제외한 다른 형태의 오버로딩된 main 메소드들은 실제로 프로그램을 실행하는 데 큰 의미가 없습니다. 이유는 다음과 같습니다:

  1. JVM은 오직 main(String[] args) 메소드만 프로그램의 진입점으로 사용합니다.
    • 오버로딩된 다른 main 메소드들은 진입점으로 사용되지 않기 때문에, 따로 호출하지 않으면 실행되지 않습니다.
  2. 직접 호출해야 하는 다른 main 메소드들은 사실상 일반 메소드와 같습니다.
    • main이라는 이름을 가졌을 뿐, 다른 메소드들과 다를 바가 없고, 오직 main(String[] args)만 특별한 역할을 하므로, 굳이 main 이름으로 오버로딩할 필요는 없습니다. 일반적으로는 의미 있는 이름을 가진 다른 메소드로 구현하는 것이 더 바람직합니다.
  3. 오버로딩된 main 메소드는 사용하지 않는 것이 일반적입니다.
    • 대부분의 경우, main(String[] args)만을 정의하여 프로그램의 진입점으로 사용하고, 다른 기능은 독립적인 메소드로 구현하는 것이 더 명확하고 직관적입니다.
    • 필요하다면, main 메소드 내부에서 다른 메소드를 호출해 기능을 분리하는 것이 더 나은 설계입니다.

예시: 불필요한 오버로딩 대신 명확한 메소드 분리

java
 
public class MyApp {
    public static void main(String[] args) {
        System.out.println("Program started");
        performTask(10);  // 별도의 메소드 호출
    }

    // 오버로딩된 main 대신 명확한 메소드 이름 사용
    public static void performTask(int num) {
        System.out.println("Performing task with number: " + num);
    }
}

이렇게 오버로딩된 main 메소드를 사용하는 대신, 명확한 이름을 가진 메소드를 사용하는 것이 더 좋은 설계입니다.

결론:

  • 굳이 여러 개의 main 메소드를 가질 이유는 없습니다. 오버로딩된 main 메소드는 특별한 경우가 아니면 거의 사용되지 않습니다.
  • 프로그램의 진입점은 언제나 main(String[] args)이고, 나머지 로직은 다른 메소드에서 처리하는 것이 좋습니다.

이 방식이 더 효율적이고, 코드의 가독성 및 유지 보수성도 높습니다.

혹시 더 궁금한 점이 있으면 질문해 주세요!