프로그래밍/Java

9. [Java] main 메서드(함수)란 무엇인가 - 코딩도치

코딩도치 2019. 11. 30. 23:56
반응형

안녕하세요. 코딩도치 입니다~

 

오늘은 앞서 실습을 하면서 등장했던 main이라는 메서드(함수)에 대해서 알아보겠습니다!

 

사실 main 메서드 자체에 대단한 의미가 있거나, 특별한 기능이 있는 것은 아닙니다.

 

main 메서드는 Java로 구현된 프로그램이 시작될 때 가장 먼저 실행되는 메서드입니다.

 

이것은 Java의 규칙이고, 받아들이시면 되는 부분입니다.

 

' Java 소스는 무조건 main 함수에서부터 시작된다! '

 

정말 별거 없죠?

 

하지만 이 main 메서드의 형태를 분석해 봄으로써 더 Java라는 언어의 사용에 능숙해질 수 있습니다.

 

public static void main(String[] args)

 

Class를 생성할 때 main 메서드 생성에 check를 하게 되면 위와 같은 main 메서드가 Class 내부에 생성됩니다.

2019/11/25 - [프로그래밍/Java] - 7. [Java] Class 개념 + 사용 방법(feat. eclipse) - 코딩도치

 

7. [Java] Class 개념 + 사용 방법(feat. eclipse) - 코딩도치

안녕하세요. 코딩도치 입니다~ 오늘은 Class에 대해서 알아보고 실습까지 진행해보도록 하겠습니다! 1. Class란 앞서 객체 지향 프로그래밍에 대해서 포스팅을 했었습니다. 객체 지향 프로그래밍에 대한 이해가 선..

codingffler.tistory.com

main method가 왜 저런 형태를 가지는 것인지 이제부터 알아보도록 할까요?

 

1. public

 

먼저 가장 앞에 나오는 public에 대해서 알아보도록 하겠습니다.

 

Java에는 접근제어자라는 문법이 있습니다.

 

변수, 메서드(함수), 클래스에 대한 접근을 제한하는 기능을 하는 문법입니다.

 

public이 그 접근 제어자 중 하나입니다.

 

public > protected > default > private

 

접근 제어자의 종류는 위와 같은데,

 

왼쪽에서 오른쪽으로 갈수록 해당 변수나 메서드(함수) 등에 대한 접근이 어렵게 됩니다.

 

- public  : 접근에 제한이 없음

- protected : 동일한 패키지 내에 있거나, 파생 클래스의 경우 접근 가능

- default : 아무런 접근제어자를 명시하지 않았을 경우 할당되는 제어자이며, 동일한 패키지 내에서만 접근 가능

- private : 자기 자신의 클래스 내에서만 접근 가능

 

main 메서드는 프로그램이 실행될 때 가장 먼저 실행되는 메서드라고 말씀드렸죠?

 

main메서드가 어디에 있건 JVM(Java Virtual Machine)이 접근하는데 제한이 없어야 하기 때문에

 

public을 접근 제어자로 붙여주는 것입니다!

 

2. static

 

static : 정적인, 움직이지 않는

 

static은 위와 같은 뜻을 가지고 있습니다. 이러한 뜻을 가진 단어를 붙여주는 이유가 무엇일까요?

 

먼저 한 가지 짚고 넘어갈 것이 있습니다.

 

Class라는 것은 객체를 만들기 위해서 필요한 것이었습니다.

 

그래서 이전 시간에 Class에 대한 실습을 하면서, Person Class를 만들고 객체를 생성하는 작업을 했었죠.

2019/11/28 - [프로그래밍/Java] - 8. [Java] Class 개념 + 사용 방법(feat. eclipse) 두번째 : 생성자(Constructor) - 코딩도치

 

8. [Java] Class 개념 + 사용 방법(feat. eclipse) 두번째 : 생성자(Constructor) - 코딩도치

안녕하세요. 코딩도치 입니다~ 오늘은 저번 시간에 이어 Class 사용 방법에 대해서 좀 더 알아보도록 하겠습니다. 저번 시간에 Class를 붕어빵 틀에 비유하면서 설명을 했었는데요. 2019/11/25 - [프로그래밍/Java..

codingffler.tistory.com

그런데 한 가지 의문이 있습니다.

 

Main Class도 생성했지만 그 안에는 main 메서드만 존재할 뿐이고, Class를 이용해 객체를 생성하지도 않았습니다.

 

이상하지 않나요?

 

이것이 바로 main 메서드에 붙어 있는 static의 작용입니다.

 

static이라는 단어는 Java에서 '메모리에 고정이 된다. 변하지 않는다'라는 의미에서 사용된 것입니다.

 

하지만 실제로 이 static은 '공유'의 의미를 가지고 있습니다.

 

static이 붙어 있으면 모든 객체가 공유하는 변수, 메서드를 의미하는 것이죠.

 

근데 여기서 잠깐,

 

생성되는 모든 객체가 공유하는(모든 객체에서 동일하게 동작하는) 메서드를 사용하기 위해서,

 

객체를 하나 생성할 필요가 있을 까요? 네, 없습니다!

 

그래서 static을 붙여준 변수, 메서드 들은 따로 객체를 생성하지 않고도 사용할 수 있다는 성질을 가지게 되는 것입니다.

 

이제 저번 시간에 왜 Main Class를 이용해서 객체를 만들지 않았는지 아시겠죠?

 

그렇다면 main 메서드에는 왜 static을 붙여주었을 까요?

 

이것 또한 프로그램을 실행하면 main 메서드를 가장 먼저 실행한다는 Java의 규칙에 의해서 구성된 것입니다.

 

어떠한 메서드가 실행되기 위해서는 프로그램이 실행되고 메모리에 해당 메서드가 할당되어야 합니다.

 

main 메서드를 가장 먼저 실행해야 하는데,

 

만약 static이 붙어 있지 않다면 어딘가에서 어떠한 객체가 main 메서드를 호출을 해주어야 합니다. 

 

그렇다면 결국 main 메서드를 가장 먼저 실행한다는 규칙이 무너지는 것이겠죠?

 

그래서 static을 붙여줌으로써 어떠한 객체가 main 메서드를 호출해주지 않아도

 

프로그램이 시작되면 자동적으로 메모리에 할당되고, 가장 먼저 실행될 수 있도록 하는 것입니다.

 

(시스템적으로 더 자세한 내용들이 있습니다. 프로그램 실행 순서, 컴파일 시간, 런타임 시간 등 더 자세하고 깊은 내용들이 많지만 이 정도까지만 이해하셔도 충분하다는 생각이 듭니다! 혹시나 궁금하시면 댓글 남겨주세요~)

 

3. void

 

메서드에서 void 위치는 바로 반환형이 들어가는 위치입니다.

 

반환형이란 해당 메서드가 실행되고 나서 어떠한 결과값, 데이터를 반환할 것인가를 정의하는 부분입니다.

 

한 가지 예를 들어드리도록 하겠습니다.

 

1 + 2 덧셈을 하는 add 메서드가 있다고 해봅시다.

 

add 메서드가 실행되면 어떤 결과값, 반환형이 나올까요? 바로 3, 정수입니다. 그러니 add 메서드의 반환형은 int

 

int add() 메서드를 작성하면 되는 것이죠.

 

똑같이 1.2 + 2.2 덧셈을 하는 add 메서드가 있다고 해봅시다.

 

이 경우에는 결과값, 반환형이 3.4, 실수입니다. 그러니 add 메서드의 반환형은 float

 

float add() 메서드를 작성하면 되는 것입니다.

 

예시에서 int, float처럼 void 또한 반환형 중 하나입니다.

 

하지만 어떠한 값도 반환하지 않을 때 사용하는 반환형인 것입니다.

 

메서드의 실행 결과 반환해 줄 어떠한 데이터도 없고, 반환해줄 필요도 없는 메서드에 작성하는 반환형인 것입니다.

 

main 메서드가 처음부터 끝까지 실행되고 나고 프로그램이 종료되는 것이기 때문에,

 

어떤한 결과값도 반환해줄 필요가 없겠죠? 그래서 void를 사용하는 것입니다.

 

4. String[] args

 

해당 부분은 매개변수 부분입니다.

 

main 메서드를 실행하는 데 필요한 값들이 있다면, args변수를 통해서 main 메서드에 전달되는 것입니다.

 

args는 arguments의 약어로 단순히 변수 명일뿐입니다.

(바꾸고 싶으시다면 바꾸셔도 무방합니다)

 

이렇게 오늘은 main 메서드에 대해서 알아보았습니다.

 

main 메서드를 분석해 봄으로써 Java에서 변수, 메서드 등의 형태, 사용법에 대해서 알아볼 수 있었습니다.

 

다음에는 이번에 알아본 내용을 바탕으로 직접 실습을 해보고,

 

실제로 각각의 경우에 소스가 어떻게 동작하는 것인지 알아보도록 하겠습니다! (접근제어자, static, 반환형 사용법)

 

감사합니다.

반응형