Skills/Java

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

aoaa 2022. 5. 4. 17:33

public class Main{
	public static void main{String[] args){
    }
}

 Java에서 모든 프로그램은 public static void main(String[] args)라는 함수로 시작합니다.

코드에 대해 의미를 살펴보겠습니다.

 

 

1.  제한자

  먼저 public제한자 부분으로 모든 함수의 앞에는 이 함수를 어디에서 접근할 수 있는지 범위를 지정할 수 있습니다.

 여기서 접근 제한자는 객체 자신들만의 속성이자 특징이므로 대외적으로 공개되는 것이 좋지많은 않습니다.

  그런 이유에서 프로그래머가 객체들에게 접근 제한을 걸 수 있는데, 이를 Java에서는 접근 제한자라고 합니다.

 

접근 제한자의 종류로는

1) public : 모든 접근을 허용

2) protected : 같은 Package(폴더)에 있는 객체와 상속관계의 객체들만 허용

3) default : 같은 Package(폴더)에 있는 객체들만 허용

4) private : 현재 객체 내에서만 허용

으로 분류되며,

 

접근 제한자 별 사용 가능한 범위는 

  • Class에 사용 가능
    public, default
  • Construtor
    public, protected, default, private
  • Member 변수
    public, protected, default, private
  • Member method
    public, protected, default, private
  • 지역 변수
    접근 제한자 사용 불가

으로 범위가 제한됩니다.

 

 만약 main함수에서 public이 아닌 private, protected를 사용하게 되면 다음 에러가 발생합니다.

 직역하자면 'Error : Test라는 클래스에서 기본 메서드를 찾을 수 없습니다. public static void main~~ 의 형식으로 기본 메서드를 정의하세요.' 입니다.

 

 이는 main 함수는 모든 실행프로그램의 기본이 되는 함수이기 때문입니다. 즉 어디에서나 접근이 가능해야 합니다. 

위에 종류에서 private과 protected의 접근범위가 다르며, main 함수의 제한자가 public이 아니라면 main 함수에 접근하지 못하는 클래스가 있을 수 있어 public으로 선언되어야 합니다.


2. Static

 Java에서는 변수나 함수를 메모리에 할당하는 법이 2가지가 있습니다. 

하나는 static 영역에 선언, 다른 한 가지는 heap 영역에 선언(new 연산자)하는 것입니다.

  static heap
메모리 할당 기준 프로그램이 실행되는 순간 연산이 실행되는 순간
메모리 정리 기준(garbage collector) 정리 대상이 아님 garbage collector에 의해 정리됨

 만약 main 메서드가 heap 영역에 선언된다면, garbage collector에 의해 메모리에서 정리되어 프로그램이 죽게됩니다. 

필요한 메모리 공간을 라이브러리를 통해 OS로 부터 할당받아 사용하다 다 쓰게되면 OS로 반환을 해야합니다. 프로그래머가 꼼꼼하게 메모리 관리를 하지 않는다면 OS로부터 메모리 공간을 할당 받기만하고 반환하지 않아 프로세스가 점점 커지다 OS에 의해 시그널을 맞고 죽게됩니다. 여기서 메모리를 해제하지 안하 생기는 버그를 메모리 Leak라고 합니다. 

Java에서는 JVM(Java Virtual Machine)의  Garvage Collector가 불필요한 메모리를 알아서 정리해줍니다. Java는 직접 메모리 공간의 할당과 반환을 수행하는 대신 JVM을 통해 메모리를 할당받게 되며, 더 이상 사용되지 않는 메모리 공간은 JVM이 알아서 회수한 다음 해제해줍니다. 

 

따라서 static으로 선언하여 메모리에 항상 상주하도록 해줘야 합니다.

 만약 static을 사용하지 않으면 다음과 같은 에러가 발생합니다. 

 


3. void

 void는 함수가 끝날 때 return값이 없다 라는 뜻입니다.

Java의 모든 메서드 시그니처에는 return type을 정의하도록 되어있습니다. return type이 필요없는 경우는 void 키워드로 return하는 것이 없다고 정의합니다. 여기서 Java 메인 메서드에는 return 값이 없습니다. 왜냐하면 메인 메서드의 실행이 끝난다는 것은 Java의 종료를 의미하기 때문에 return 값이 필요없기 때문입니다. 그래서 main 메서드에서 무엇인가 반환하려고 하면 컴파일 에러가 발생합니다. 


 4. String[] args

 args은 문자열을 배열로 사용하겠다는 의미입니다.

args는 변수명이기 때문에 꼭 args 가 아니어도 상관은 없지만 String[] args 구문 자체는 뺄 수 없습니다. 

 

 모든 함수는 매개변수를 사용하거나 사용하지 않을 수 있습니다. main함수도 마찬가지입니다.

but 일반 함수는 main함수 내부에서 호출하기 때문에 입력값을 적어도 main함수에서 정할 수 있습니다.

 여기서 main 함수는 프로그램 실행 시 처음으로 수행되는 함수이기 때문에 외부로부터 값을 입력받을 수 있어야 합니다.

프로그램 내부에서는 값을 호출할 수가 없기 때문에 항상 문자열 인자를 받게됩니다. 

 

 

 

 

 

 

출처

더보기

 

'Skills > Java' 카테고리의 다른 글

Java - Stack  (0) 2022.05.23
Java - Parameter, Argument  (0) 2022.05.20
Java new 연산자  (0) 2022.05.10
Scanner & BufferedReader  (0) 2022.05.07
Java 구성 (class, method, instance)  (0) 2022.05.06