public static void main(String[] args)
자바의 모든 프로그램은 public static void main (String[] args)함수로 시작한다.
이렇게 시작하는 것은 자바의 규칙이다.
다수의 프로그래밍 언어에서 main함수가 엔트리 포인트로 사용된다.
※엔트리 포인트(Entry Point)란 프로그램이 시작되는 시작점을 의미한다.
Java는 어플리케이션이 실행되면 제일먼저 (main)메소드를 실행한다.
public static void는 무엇인가?
String[] args?은 무엇인가?
public은 접근제어자이다.
접근제어자는 외부에서 접근할 수 있는 일종의 제약이다.
public은 어느곳에서든 해당 객체를 참조할 수 있다는 의미이다.
모든 함수의 앞에는 이 함수를 어디에서 접근할 수 있는지 범위를 지정할 수 있다.
접근 제어자의 종류는 제약이 강한 순서대로 private > protected > public 이 있다.
defualt는 클래스 내부와 동일 패키지에서 접근할 수 있다.
main 함수는 public을 지정해야 한다. private이나 protected를 사용하게 되면 에러가 발생한다.
main 함수는 모든 실행 프로그램의 기본이 되는 함수여야 한다.
기본이 되는 함수이기 때문에 어디에서나 접근이 가능해야한다.
privat는 해당 클래스에서만 접근이 가능하고 protected는 같은 패키지 내에서만 접근이 가능하다.
main 함수의 제한자가 public이 아니라면 main 함수에 접근하지 못하는 클래스가 생길 수 있다. 이런 경우가 발생하면 에러가 발생하기 때문에 public으로 선언되어야 한다.
그렇다면 아무곳에서나 메인메소드를 호출하면 되는건가요?
자바 어플리케이션이 실행되면 제일먼저 main메소드를 실행한다. 프로그램의 시작은 main이기때문에 난 main메소드에서는 정의만 하고 다른곳에서 이것을 호출할거야 라는 의미는 사용할 수 없다.
만약 main 메소드에서 hello world만 출력하고 다른 클래스를 호출하여 메인메소드를 사용했을 경우 무한히 hello world 출력이 반복되는 장면을 볼 수 있다.
Static // 정적 함수임을 의미한다. 즉 가만히 있어도 되는? 이라는 의미로 해석된다.
static으로 함수 또는 클래스를 선언했을 경우 해당 객체는 자바가 컴파일 되는 순간 정의가 된다. 그리고 이후 static이 아닌 객체가 정의가 된다.
따라서 일단 static 객체에서 static이 아닌 객체를 호출하는 것은 불가능하다.(참조, 호출하다?)
static이 먼저 정의가 되기 때문에 아직 정의되지 않은 객체는 호출할 수 없다. 순서를 생각해보면 금방 이해될 내용이다.
자바는 변수나 함수를 메모리에 할당하는 방법이 2가지가 있다.
첫번째는 static 영역에 선언하는 것이고, 다른 하나는 heap 영역에 선언(new연산자)하는 것 이다.
메모리 할당 기준은 static은 프로그램이 실행되는 순간이고 heap은 연산이 실행되는 순간이다.
static은 Garbage Collector의 메모리 정리대상이 아니고 heapdms 정리 대상이다.
main메소드가 heap 영역에 선언되면 어떻게 될까?
main 메소드는 프로그램에 없어서는 안되는 기본 함수이다. 이 함수가 Garbage Collector에 의해 메모리에서 정리되면 어떻게 될까? 기본이 되는 함수가 정리되었으니 프로그램은 죽는다.
따라서 static 으로 선언하여 메모리에 항상 상주하도록 설정한다.
static 메서드는 객체를 생성하지 않고도 호출할 수 있다는 특징이 있다. (객체를 생성하고 static 메서드를 호출할 수는 있지만 좋지 않다. 만약 static이 없어서 메인 메서드의 객체를 만들어야한다면, 생성자 때문에 조금 까다로울 수 있다.
왜냐하면 다음과 같이 메인 메서드가 포함된 클래스의 생성자에 제대로된 인자값을 넣어주지 못한다면, 객체로 만드는 것에 실패하고 메인 메서드를 호출하지 못하기 때문이다.
(사용자가 생성자로 어떤 인자값을 받을지에 대해서는 JVM은 모르기 때문이다.)
void // "함수가 끝날 때 리턴값이 없다"라는 의미이다.
나는 그냥 실행만 할뿐.. 나에게 다른걸 바라지마..너에게 아무것도 돌려주지 않는다..
말그대로 void는 리턴되는 값이 없다. 단지 해당 함수가 종료된후 호출한 부분으로 이동할뿐이다.
더 쉽게 이해하자면 void 자리에 int를 넣을 경우 어떠한 처리를 실행한 후 정수형 데이터를 돌려보내겠다는 뜻이며 String이 들어갈 경우 문자형 데이터를 돌려보내겠다는 의미이다.
종합, main 메소드는 자바 어플리케이션 실행 시 제일 먼저 동작하며 어느 객체에서든 접근할 수 있으며 자바가 컴파일 되는 순간 정의되는 돌려주는 값이 없는 함수이다.
String[] agrs // args 문자열을 배열로 사용하겠다는 의미이다.
String은 문자열을 의미한다. " "쌍따옴표 안에 들어가는 문자들의 집합, "Hello World"와 같은 데이터의 형태를 String이라는 클래스변수로 정의하겠다는 의미이다.
[] // 배열을 의미한다. 연속적인 데이터를 하나의 변수에 넣고 싶을때 즉, 배열에는 인덱스가 있고 [0],[1],[2]와 같이 인덱스로 구분되는 공간에 데이터를 넣겠다는 의미이다.
String 객체로 정의된 args 라는 이름의 배열로 파라미터를 받겠다라는 의미
args // 단순한 변수명이다. 아무 변수명이나 넣어도 상관없다.
그러나 String[] args 구문 자체를 뺄 수는 없다.
왜냐하면, 모든 함수는 매개변수를 사용할수도 있고 않을수도 있다. 이는 main 함수도 마찬가지이다.
그러나 일반 함수는 main함수 내부에서 호출하기 때문에 입력값을 적어도 main함수 안에서 정할 수 있다.
그러나 main함수는 프로그램 실행 시 처음으로 수행되는 함수이기 때문에, 외부로부터 값을 입력받을 수 있어야 한다.
프로그램 내부에서 값을 호출할 수가 없으며, 이렇기 때문에 항상 문자열 인자를 받게 된다.
종합하면 연속적인 문자열 데이터가 들어가는 저장공간 이라고 생각하면 된다.
일반함수는 void를 사용해도 되고 int, char 등 다른 타입을 사용해도 문제 없이 동작한다.
그런데 왜 main 함수만 void여야 할까?
이유는 main 함수가 종료되면(혹은 비정상적으로 죽으면) 프로그램이 종료된다. 프로그램 자체가 종료되기 때문에 return값의 의미를 지닐 수 없다.
반면, 일반함수의 경우 정상적 혹은 비정상적인 경우 리턴값을 변수에 담아 다음 단계를 진행할 수 있다.
그래서 main 함수는 void를 의무적으로 사용해야 하고 return 값을 가지기 위해 void 대신 다른 타입을 사용하는 경우 에러가 발생한다.
자바의 시작은 main 함수명으로 시작해야 한다. 이는 규칙이기 때문에 설명하기 애매하다.
https://javacpro.tistory.com/11
'Language' 카테고리의 다른 글
[Java] Final(최종) 이해 (0) | 2023.01.09 |
---|---|
[Java] 인터페이스(Interface) (0) | 2023.01.09 |
[Java] 다차원 배열 (0) | 2023.01.09 |
[복습용] Java 조건문 & 반복문 (0) | 2023.01.08 |
[Trouble Shooting] 자바 컴파일 에러 error: unmappable character for encoding MS949 (0) | 2023.01.01 |
댓글