개발자 삽살개

Java에서 메인함수의 void는 어떤 의미일까. 본문

개발하다가

Java에서 메인함수의 void는 어떤 의미일까.

개발자 삽살개

자바에서 메인 메서드를 선언할 때, 이 문장을 쓴다.

public static void main (String[] args)

이것은 자바 프로그램이 실행될 때 가장 먼저 호출되는 메소드이다.
자바 프로그램은 main 메소드를 찾아서 실행을 시작하며, main 메소드가 정의되어 있지 않으면 프로그램은 실행되지 않는다.

메인메서드 선언 시, 단어들을 살펴보자.

public: main 메소드가 다른 클래스나 패키지에서 접근 가능하도록 접근 제어자를 public으로 지정.

static: main 메소드가 정적 메소드(static method)임을 나타냄. 정적 메소드는 객체의 인스턴스 없이 호출할 수 있는 메소드.

void: main 메소드가 반환하는 값의 타입을 나타냄. void는 반환 값이 없음을 의미.

main: 메소드의 이름으로, 자바 가상 머신(JVM)은 프로그램 실행 시 main 메소드를 찾아 실행을 시작

String[] args: main 메소드의 매개변수로, 프로그램 실행 시 커맨드 라인에서 전달되는 인자값을 저장하는 배열
이 배열을 통해 프로그램에 인자값을 전달.


질문. 자바의 메인메서드는 왜 반환하는 값의 타입은 void일까?

 

우선, 메인 메서드에서 void를 int로 바꿔서 작성하면 어떻게 될까?
에러발생하여 실행되지 않는다.

- > 이유 1. 설계 원칙 상의 관례다.

자바에서는 main 메서드의 반환 타입을 void로 정의하는 것이 관례이다.
이는 자바 언어의 설계 원칙과 관련이 있다.
자바에서는 프로그램의 종료 상태를 반환하는 대신, 예외(Exception)을 사용하여 프로그램의 비정상 종료 상태를 처리한다.
따라서 main 메서드가 void를 반환하고, 예외 처리를 통해 프로그램의 비정상 종료 상태를 다루는 것이 관례적인 방식이라는 것!!


** C에서 main 함수는 int를 반환하는 것이 관례로, 이는 프로그램의 종료 상태를 나타내기 위한 것이다.
main 함수가 반환하는 값은 운영 체제에 프로그램의 종료 상태를 전달하는데,
C에서는 반환 값은 보통 0을 사용하여 정상 종료를 나타내고, 0 이외의 값을 사용하여 비정상 종료 상태를 나타낼 수 있습니다.

2. Void가 아니면, 객체 생성과 연관성에 어긋남

자바에서는 main 메서드가 프로그램의 진입점이면서 클래스 메서드(static method)로 정의된다.
클래스 메서드는 특정 객체 인스턴스에 속하는 메서드가 아니다.
따라서 main 메서드가 반환 값을 가진다면, 해당 반환 값과 객체 인스턴스 간의 연관성을 암시하게 될 수 있다.
연관성을 없애버려서, 메인메서드를 명확하게 표현하기 위함!

3. 멀티스레드를 염두해두고 만들었기 때문

C언어는 main함수 그자체가 하나의 전체 프로그램이며, 완결된 로직이었다.
단일 스레드 시절이었고, 복잡한 프로그램이 아니였다.
따라서 코드 진행 중 끝에 다다르면, 리턴코드를 뱉고 프로그램을 깔끔하게 끝내는 형태였던 것.

하지만, 자바는 멀티스레드를 염두하고 만들어졌다.
메인함수 안에 자식스레드를 생성하고 프로그램이 돌아간다.
자식스레드가 돌고 있는데, 메인함수가 리턴값을 뱉고 죽는다면 안타까운 상황이 발생한다.
그래서 메인함수가 리턴코드를 뱉을 수 없게 void로 고정을 했다고 한다.



평소에 생각을 정리하지 않았다니, 말하기 힘든 상황이 펼쳐졌다.
말이 한 번 막히니, 다음번 말이 어려웠다.
서툴기만했다. 아직도 창피하다.
만약 다음이 온다면, 오늘같은 실수는 하지않으리.
너무 아쉽다. 정말 아쉽다.

Comments