2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

私は12月ごろに大学の講義内で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メソッドがインスタンスだった場合、クラスのインスタンスも必要です。
インスタンスメソッドを呼び出すためには、そのクラスのインスタンス(オブジェクト)を呼び出す必要があり、例えば以下のように記述する必要があります。

public class MyClass {
    public void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

また、これを動かす際は次のようにインスタンスを生成するコードが必要です。

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

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

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

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

よってvoidと記述します。

main

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

String

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

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

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

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

args

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

おわりに

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

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

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?