【Java】「おまじない」を解読する

# はじめに
私は12月ごろに大学の講義内で`Java`を勉強し始めました。
しかし、いざ蓋を開けてみると、「とにかく早く課題を終わらせたい」という一心でコードを書いている自分がいました。そこで、今回はタイトルの通り、今までなんとなく記述していた「おまじない」について調べ、まとめました。

初歩的なものになってしまうと思いますが、参考になれば幸いです。

では、始めていきます。

# 「おまじない」とは？
私は普段`Java`のコードを書き始める際、「なんとなくこれは書いておかないと」というマインドで以下のように書いてから中身を考えるようにしていました。

```java:sample.java
public sample  {
    public static void main(String[] args) {
        //何かしらの処理を書き始める
    }
}
```
そこで思ったのが、「`Public static void main(String[] args)`って結局なに？」ということです。思い出してみると、「これは『おまじない』的なもので、今はまだ理解しなくても大丈夫」と言われていたような気がします。

紹介が遅れましたが、まさにこの部分が「**おまじない**」の正体です。

これについて一言でまとめると、`Javaのmainメソッド`ですが、深掘りしていきます。

理解しやすくするために、このかたまりをとても細かくして、それぞれについて触れます。

## `public`？
`mainメソッド`が`public`であるのは単に**そう決まっているから**です。
また、補足ですが「public」の意味とほぼ同じで**どこからでも参照できる**的な意味合いをもっています。

## `static`？
「なぜ`static`を用いるのか」という議論と順番が逆になってしまっているような気がしますが、そもそも`mainメソッド`は「インスタンスメソッド」ではダメです。
なぜなら`Java`には、**「クラスの詳細を知らなくても、絶対確実にインスタンスを生成できる方法がJavaにはない」から**です。

正直、私はこの文章だけでは「？」しかなかったので解説します。

ここで`mainメソッド`の定義を振り返りましょう。
`mainメソッド`はいわばプログラムを動かす際の「入口」となるもので、ここから`Java`の処理は始まります。

最初に実行されるということは、**`mainメソッド`は`Java Virtual Machine (JVM)` が直接呼び出す**ということになります。

もし`mainメソッド`がインスタンスだった場合、**クラスのインスタンスも必要**です。
インスタンスメソッドを呼び出すためには、そのクラスのインスタンス（オブジェクト）を呼び出す必要があり、例えば以下のように記述する必要があります。
```java:
public class MyClass {
    public void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
```
また、これを動かす際は次のようにインスタンスを生成するコードが必要です。
```java
MyClass obj = new MyClass();
obj.main(args);
```
しかし、`JVM`はプログラムの実行開始時点で、この`MyClass`をどのようにインスタンス化すればよいかを知らないため、実行に移ることは**不可能**です。

よって、「`mainメソッド`は`staticメソッド`でないといけない」となります。


## `void`？
そもそもですが、「`Public static void main(String[] args)`」において`void`は「戻り値」を表します。つまり、「戻り値はない」ということを表します。
「戻り値がない」ことを、例え話にして表してみます。

`JVM`を「何かしらのイベント（会場）」`mainメソッド`を「イベントの準備スタッフ」、`スレッド`を「イベント参加者」というように考えてみましょう。
なんとなく、画像で表してみました。

![スクリーンショット 2024-12-14 112537.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817741/8fbf6dcb-7b93-37f6-3aef-0be5495dcb4e.png)


`mainメソッド`の開始は「イベントの準備の開始」を表し、イベントのために必要なものを集めます。例えば「イベント参加者に宣伝する（呼び出す）」などがあります。

さて、イベントが本格的に始まりました。参加者はそれぞれ独立して活動を始めます。もちろん、各自終わるタイミングも様々です。
**ここで注意してほしいのは、「イベントの準備スタッフ」は準備作業が完全に終了したら帰宅する（終了する）という点です**。しかし、参加者はまだ活動しているため、イベント全体は続いています。
全ての参加者が活動を終えたら、イベントも終了となります。

ここで、`mainメソッド`に返り値があると、イベントを準備しただけでイベントが終了してしまい、せっかく呼び出された参加者がかわいそうになってきます。
だから、返り値を設定しないことで最後まで`JVM`を動かすことが可能になるということです。

よって`void`と記述します。

## `main`？
（`main`メソッドに「なぜ`main`？」という問いは不毛にも感じますが解説します。）
`main`という名がつけられるのは、`Java`が`C言語`の流れをくむプログラミング言語であるからだと考えられています。
私は`C言語`を触ったことがないのでわからないですが、きっと経験者がなじみやすいよう決められたのでしょう。

## `String`？
この部分は「引数として`String`型の配列で受け取る」ということを表します。
どうやら、これもまた`C言語`の仕様が基になっているようです。しかし、これにはれっきとした理由もあるのでそれについて説明します。

一言で表すと、「`String`型は柔軟だから」です。
例えば、`123`,`abc`,`3.14`はそれぞれ型が異なりますが、いずれも「文字列」であることに変わりはありません。つまり、全ての情報を扱うのに適した形式だということです。

また、あらかじめ「これは`String`型だよ。」と`main`に統一して伝えておくことで`JVM`がどの`main`を呼び出すのかを迷わないようにすることができます。

ただ、これは日々のプログラミングでも実感することがありますが、必要に応じて型変換の必要も生じてくるので、注意が必要です。

## `args`？
もう3度目になりますが、これまた`C言語`の仕様が基になっているようです。
別に`args`ではなく、自分の好きな名前でも代用可です。
また、こちらも`Java`を学習するさいに触れることですが、`String[] args`は、プログラム起動時に指定する値（コマンドライン引数）を表します。

# おわりに
今回の記事では`Java`の「おまじない」について解説しました。
今まで無心で書いていたコードの意味を知ることができたので、これから記述するときに毎回思い出すようにして記憶を定着させていこうと思います。

では、今回の記事はこれで終わりです。最後までお読みいただきありがとうございました。

# 参考
https://www.bold.ne.jp/engineer-club/java-main