[Java] main 메서드

toget ㅣ 2023. 10. 3. 10:12

1.main 메서드

자바의 메인 프로그램은 public static void main (String[] args) 함수로 시작합니다.

package myPack;

public class Test {
	public static void main(String[] args){
		//메인 출력
	}
}

위 예제에서 public 은 제어자입니다.

 

접근제어자

java에서는 다음과 같은 4가지의 접근 제어자를 제공합니다.

 

1. private

private 접근 제어자를 사용하여 선언된 클래스 멤버는 외부에 공개되지 않으며, 외부에서는 직접 접근할 수 없습니다.

 

2. public

public 접근 제어자를 사용하여 선언된 클래스 멤버는 외부로 공개되며, 해당 객체를 사용하는 프로그램 어디에서나 직접 접근할 수 있습니다.

 

3. default

default 접근 제어를 가지는 멤버는 같은 클래스의 멤버와 같은 패키지에 속하는 멤버에서만 접근할 수 있습니다.

 

4. protected

자바 클래스는 private 멤버로 정보를 은닉하고, public 멤버로 사용자나 프로그램과의 인터페이스를 구축합니다.

여기에 부모 클래스(parent class)와 관련된 접근 제어자가 하나 더 존재합니다.

protected 멤버는 부모 클래스에 대해서는 public 멤버처럼 취급되며, 외부에서는 private 멤버처럼 취급됩니다.

 

클래스의 protected 멤버에 접근할 수 있는 영역은 다음과 같습니다.

1. 이 멤버를 선언한 클래스의 멤버

2. 이 멤버를 선언한 클래스가 속한 패키지의 멤버

3. 이 멤버를 선언한 클래스를 상속받은 자식 클래스(child class)의 멤버

 

static 은 메모리 영역 선언입니다.

자바는 변수나 함수를 메모리에 할당하는 방법이 2가지가 있습니다.첫번째는 static 영역에 선언하는 것이고, 다른 하나는 heap 영역에 선언(new 연산자)하는 것 입니다.

 

static heap

메모리 할당 기준 : 프로그램 실행되는 순간, 연산이 실행되는 순간

메모리 정리 기준

일반적으로 메모리는 Garbage Collector 에 의해 정리가 됩니다. 그러나 Static으로 생성한 값은 Garbage Collector 정리 대상이 아니며 일반적으로 우리가 만든 Class는 Stack 영역에 생성되고, new 연산을 통해 생성한 객체는 Heap영역에 생성됩니다. 객체의 생성시에 할당된 Heap영역의 메모리는 Garbage Collector를 통해 수시로 관리를 받습니다. 하지만 Static 키워드를 통해 Stack영역에 생성가능합니다. 이렇게 Stack영역에 할당된 메모리는 모든 객체가 공유하는 메모리라는 장점을 지니지만, Garbage Collector의 관리 영역 밖에 존재하므로 Static을 자주 사용하면 프로그램의 종료시까지 메모리가 할당된 채로 존재하므로 자주 사용하게 되면 시스템의 퍼포먼스에 악영향을 주게 됩니다.

 

main에 static을 사용하는 이유

- static은 java 프로그램이 실행하기 전에 static 함수나 static 변수를 첫 단계로 메모리에 올려 프로그램을 실행시킵니다.(static이 실행시 1순위)

-프로그램이 종료될 때까지 사라지지 않습니다.

-main함수가 실행되기 위해서는 메모리에 미리 올라가야합니다.

-메모리에 올라가있지 않으면, 시작점인 main() 메소드를 호출하려고 하는데 메모리에는 main이 없기 때문에 실행을 할 수가 없습니다.

-그래서 main 메소드는 누군가 호출하기 전에 미리 메모리에 있어야 하기 때문에 static을 붙이는 것입니다.

 

void의 의미

void의 경우 메소드의 return 타입이 없을 경우 사용하는 것이다.

메소드는 main문에서 코드를 실행할 때 각 메소드를 호출하여 메소드에서 각각의 기능을 수행하는 역할을 한다.

String[] args

String[]: String[] 배열을 나타냄

args: String[] 배열의 변수, 다른 값으로 써도 되지만 통상적으로 args 사용

 

출처
https://mi-nya.tistory.com/251
https://www.tcpschool.com/java/java_modifier_accessModifier
https://mozi.tistory.com/553#toc-link-0
https://velog.io/@sparkbosing/Java-Main%EC%97%90-static%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0-%EC%B6%94%EC%83%81-%ED%81%B4%EB%9E%98%EC%8A%A4-vs-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4
https://sthyeok.tistory.com/52