-
[JAVA] public static void main (String[] args) 파헤치기프로그래밍 언어/JAVA 2022. 1. 21. 22:40
오늘부터 회사에서 사용하는 주 언어인 java를 공부하기 시작했다.
java를 처음 공부하는 것은 아니지만 그래도 다시 복습하는 느낌과 하나하나 되짚어보기 위해 공부를 하고 있다.
공부에 참고하고 있는 것은 유튜브에서 무료로 제공하는 남궁성님의 강의이다.
https://www.youtube.com/playlist?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp
오늘 배우면서 가장 많이 사용한 public static void main (String[] args)를 파헤쳐보면서 각각 무엇을 의미하는지 알아보려고 한다.
먼저, public은 무엇일까?
public은 java에서 접근 제한자를 뜻한다.
접근 제한자란 말그대로 클래스, 인터페이스, 멤버 변수, 메소드 등을 접근할 수 있는 영역(scope)을 제한을 걸어주는 역할을 한다.
java에서 제공하는 접근 제한자는 4가지가 있다.
- public: package, class가 동일하지 않아도 모든 접근이 가능한 제한자
- protected: 같은 package에서만 접근을 허용하고 다른 package에서 접근하려면 해당 class를 상속받을 시에만 접근이 가능한 제한자
- default: 동일 package에서만 접근을 허용하는 제한자로, 접근 제한자가 생략되어 있을 경우에 기본적으로 default 접근 제한자를 적용
- private: 동일 package, 다른 package 모두 접근이 불가능하고 같은 class 내에서만 접근을 허용하는 제한자
접근 제한자 사용은 아래와 같다.
- 클래스 : public, default
- 생성자 : public, protected, default, private
- 멤버변수 : public, protected, default, private
- 멤버메소드 : public, protected, default, private
- 지역변수 : 접근제한자 사용 X
그러면 이러한 접근제한자들은 왜 필요할까?
구글링을 해보면 캡슐화, 은닉화와 관련지은 설명이 나오기도 하고 조금 더 구체적으로는 사용자에게 객체를 조작할 수 있는 수단만을 제공함으로서 결과적으로 객체의 사용에 집중할 수 있도록 도와주기 위한다는 설명이 있다.
존재이유에 대해서는 공감이 되지만 아직 현업에서 실제로 사용해보면서 문제를 마주하지못해서 필요성이 크게 와닿지는 않는다.
오늘 사용한 main에는 모든 곳에서 접근이 가능한 public을 사용하는데 main함수를 다른 class, 다른 package에서 접근을 하는 일이 있을까?
이유를 찾아보니 JVM이 main메서드를 호출할 수 있도록 하기위해서라고 한다.
다음으로 static에 대해 알아보자.
static은 변수와 메서드 앞에 선언되어 정적 필드와 정적 메서드를 만들어준다.
선언된 정적 필드와 메서드는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버로 클래스 로더가 클래스를 로딩해서 메서드 메모리 영역에 적재할 때 클래스별로 관리된다.
정적 변수와 정적 메서드의 특징은 Heap영역이 아닌 static영역에 할당된다는 것이다.
static영역에 할당되기에 Garbage Collector에 의해 해제되지 않고 프로그램 종료 시까지 할당된 채로 남아있는다.
이러한 특징을 가지고 있어 static을 너무 남발한다면 메모리 비용관점에서 좋지 않을 수 있다.
static에 대해 깊게 자문자답을 잘 정리해둔 블로그 글이 있어서 본문에 넣어보려고 한다.
그러면 main은 왜 static이여야할까?
main 메서드는 프로그램의 시작점으로 삼고 있다.
즉, 우리가 프로그램을 실행하면 main메서드에 적힌 코드들을 순차적으로 실행하게 되는데 static으로 선언되어야 JVM에서 객체의 생성없이 메모리에 할당시켜 호출 가능한 형태로 만들 수 있기 때문이다.
다음으로 void에 대해 알아보자.
void의 역할은 메서드가 return하는 타입이 없음을 의미한다.
즉, 아무것도 리턴하지 않음을 선언해주는 것과 같다.
java언어 자체가 strict하기 때문에 return하는 값이 어떠한 타입인지 메서드 앞에 미리 선언해주어야한다.
만약, void로 선언하고 어떠한 값을 리턴한다면 에러가 발생한다.
그러면 왜 main은 void이여야할까?
main은 프로그램의 시작점이자 main의 끝은 프로그램의 종료를 의미한다.
그러므로 프로그램 자체가 종료되기 때문에 return 값의 의미를 지닐 수 없다.
마지막으로 String[ ] args에 대해 알아보자.
하나하나 의미를 말해보면 string은 문자열 클래스를 의미하고 [ ]은 배열을 의미한다.
그리고 args는 변수명으로 사용되는 것으로 다른 값으로 대체가 가능하다.
즉, main메서드가 String 배열을 파라미터 값으로 받을 수 있다는 것이다.
그러면 String[ ] args는 꼭 써야만 할까?
정답은 꼭 써야만하고 그 이유는 JVM의 엔트리 포인트(프로그램의 시작점)로 단 1개의 메인 메서드만 허용이 되는데 java API에서는 public static void main (String [] args) 단 한개만 엔트리 포인트로 정의했기 때문에 String[] args는 반드시 써야만한다.
<참고 자료>
https://velog.io/@gillog/Java-%EC%A0%91%EA%B7%BC-%EC%A0%9C%ED%95%9C%EC%9E%90
https://coding-factory.tistory.com/524
https://uoonleen.tistory.com/10
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
[JAVA] 인터페이스 default method (java 8) (0) 2022.09.04 함수형 인터페이스 (0) 2022.06.26 [스터디 15주차] 람다식 (0) 2021.07.28 [스터디 14주차] 제네릭 (0) 2021.07.24 [스터디 13주차] I/O (0) 2021.07.20