Java

[Java]main 함수(메서드)

DevStory 2022. 4. 10.

main() 함수

main() 함수는 Java, C, C#, C++을 입문하면서 가장 먼저 배우는 개념이고 중요한 개념입니다. 대학교 시험이나 신입 면접에서 자주 출시되는 내용이며 경력 있는 개발자에게는 더 어려운 질문을 요구합니다.

 

이번 포스팅은 면접 질문에서 나올 법한 main() 메서드(함수) 내용들을 소개합니다.


main() 메서드가 public static인 이유

A. 정적(static)인 이유

JVM이 실행되는 과정에 클래스 객체가 포함되지 않습니다. JVM이 클래스 객체 없이 main() 메서드를 메인 메모리에 적재할 수 있도록 static 키워드를 추가합니다.

 

만약, main() 메서드를 non-static으로 선언하면 JVM은 main() 메서드가 존재하는 클래스 객체로 main() 메서드를 호출해야 합니다.

B. public인 이유

main() 메서드를 public으로 설정하는 이유는 JVM이 main() 메서드를 메인 메모리에 적재해야 하기 때문입니다. 만약, 다른 접근자로 할당하면 컴파일은 성공하지만 main() 메서드를 접근할 수 없으므로 "main method not found"라는 런타임 오류가 발생합니다.


main() 메서드를 오버로딩(Overloading)할 수 있는가?

Java에서 main() 메서드를 오버로딩할 수 있습니다. 매개변수가 다른 main() 메서드를 얼마든지 가질 수 있습니다.

public class Program {
  // 기본 main() 메서드
  public static void main(String[] args) {
    System.out.println("Basic main method");
    main(new Integer[]{10, 100, 1000});
  }

  // 오버로드된 main() 메서드
  public static void main(Integer[] args) {
    System.out.println("Integer[] args: " + Arrays.toString(args));
  }
}

실행 결과

Basic main method
Integer[] args: [10, 100, 1000]

main() 메서드를 오버라이딩(Overriding)할 수 있는가?

main() 메서드를 오버라이딩(Overriding)하는 것은 불가능합니다. 메서드 오버라이딩은 런타임 시점에 결정되는데 static 메서드는 컴파일 시점에 선언되므로 오버라이딩 할 수 없습니다.


main() 메서드에 사용 가능한 접근자

main() 메서드에는 public만 사용할 수 있습니다. 만약 다른 접근자(private, protected, default)를 사용하면 런타임 오류가 발생합니다.

반응형

final 메서드로 만들 수 있는가?

main() 메서드에 final 키워드를 사용할 수 있습니다. final 키워드는 해당 메서드의 오버라이딩을 금지시키는데, main() 메서드는 오버라이딩 불가능하므로 아래와 같이 final 키워드를 사용할 수 있습니다.

public class Program {
  public static final void main(String[] args) {
    // ...
  }
}

main() 메서드를 동기화할 수 있는가?

synchronize 키워드를 사용하여 main() 메서드를 동기화할 수 있습니다. 애플리케이션이 완전히 구동되기 전에 특정 작업을 처리하기 위해 사용할 수 있습니다.

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

main() 메서드의 반환 타입을 변경할 수 있는가?

Java에서 main() 메서드의 반환 타입은 항상 void입니다. 만약 다른 타입으로 선언하는 경우 런타임 오류가 발생합니다.


main() 메서드에서 비정적 메서드를 호출하는 방법

정적 메시드에서 비정적 메서드를 호출하기 위해서는 클래스 객체가 필요합니다. main() 함수 내부에 클래스 객체를 생성하고 비정적 메서드를 호출합니다.

public class Program {
  public static void main(String[] args) {
    Program obj = new Program();
    obj.print();
  }
    
  public void print() {
    System.out.println("Non-static method()");
  }
}

실행 결과

Non-static method()
반응형

댓글