Help us understand the problem. What is going on with this article?

Java初学者がHello Worldを読解してみた

More than 1 year has passed since last update.

はじめに

新卒入社先の研修で初めてJavaに触れたので、アウトプットとしてHello Worldを読解してみました。
読解するソースコードはこちら。

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

出力結果

Hello World

読解開始

1.public class Main {}

一度に全てを読解するのは難しそうなので、ソースコードを分解しながら見ていきます。
まずは、一番外側にあるこちらの部分から。

public class Main {

}

1-1.class Main

「class Main」は、このブロック({}で括られている範囲)全体がクラスであり、そのクラスの名前が「Main」であるということを表しています。
Javaにおける「クラス」とは、Javaで書かれたプログラムそのものです。

「Java言語でプログラミングをする」=「クラスを作成する」

と言ってよいでしょう。
プログラミングの過程で、クラスの中には何かしらの「機能」が書き込まれます。
そうしてできあがったプログラムは、その機能(たち)を使って、何かしらの処理を行います。
実際にインターネット上で動いているJavaプログラムのほとんどは、複数の「クラス(機能)」が組み合わさって一つになったものです。

1-2.public

ソースコードの先頭に付いている「public」とはなんでしょうか。

「public」がクラスに付くことで、そのクラスは「他のクラスからアクセス可能」になります。
クラスは何かしらの機能を持っている、ということを前提にこれを言い換えると、

「あるプログラムがクラスAとクラスBの組み合わせからなっている時、
クラスAにpublicが付いていれば、クラスBはクラスAの機能を利用することができる。」

ということになります。

これを書きながら、
「今回のHello WorldプログラムにはMainクラスしか存在しないのであれば、現時点では「public」が付いている意味がないのでは?」と自分ながら思いましたが、将来的にこのプログラムに追加のクラス(機能)を加えたくなった時のことを考えると、publicを付けておく意味はあると言えるでしょう。

2.public static void main(String[] args) {}

続いては、一つ内側に入って

public static void main(String[] args) {

  }

こちらを読解します。
これはメソッドと呼ばれるもので、クラスが持つ機能の内容を表すものです。

2-1.main(String[] args)

ここでは「main」がメソッドの名前にあたり、このブロック全体を「mainメソッド」と呼ぶことができます。

メソッドは、必ずクラスのブロック内に入ります。

なぜかというと、クラスが持つ機能=メソッドであるからです。
基本的にクラスは、複数ないしは1つのメソッドを持っています。

ではこのまま、mainの後に続いている「(String[] args)」についても説明します。
ここは、

mainメソッドが受け取る引数の型と名前を指定する部分

です。
String[]が引数の型、argsが名前にあたります。
ここで「引数」と「型」という概念が2つ出てきましたので、ざっくりと説明します。

引数:
mainメソッドの機能を使う為に必要な原料(データ)のこと。これが指定されているということは、mainメソッドは渡された原料に対して何かしらの処理を行う機能を持っていると言えます。逆に言えば、原料を渡さなければmainメソッドは動いてくれません。

型:
メソッドに渡す引数にはいくつかの種類があり、種類ごとに「〜型」という風に表現されます。ここでは、String[]という型のデータを渡すように指定しています。

以上を踏まえて「main(String[] args)」の意味するところを日本語化すると、

「mainメソッドは、String[]という型でargsという名前の引数を受け取って動くメソッドである。」

という文章になります。

2-2.public static void

先頭の方に付いている「public」、「static」、「void」とはなんでしょうか。

これらはmainメソッドの頭につくことで、メソッドの性質を伝えてくれるものです。
一つ一つ意味を説明します。

public:
これが付いているメソッドは、自分が所属しているクラス以外のクラスからも使用することができます。
メソッドによっては、あえて他クラスから使用できないようにするケースもあります。

static:
これが付いているメソッドはクラス内で固有に保持され、またクラス内で共有して使われる。
クラスのためのメソッド、と言えるでしょう。

void:
何かしらの処理を行ったメソッドが、結果として返す値(データ)の形を指定しています。「void」は、「何も返さない」ということを表しています。
例えばここの部分がvoidではなくString[]であれば、メソッドは処理の結果としてString[]という型のデータをメソッドの呼び出し元に返します。

3.System.out.println("Hello World");

最後に、mainメソッドの中身である

System.out.println("Hello World");

この1行について説明します。
この1行を読むと、
「System.out.println()」という部分が何かしらを出力するための記述で、ここでいう「何かしら」が「"Hello World"」である。
ということは感覚的に理解できると思います。

System.out.println()はJavaで文字列などを出力するための、おきまりの構文と割り切って覚えてもよいのですが、今回は自分のアウトプットのために書いているので、可能な限り説明します。
「System.out.println()」を見ると、「.」で区切られている箇所があります。
Javaにおける「.」は、日本語でいう「〜の」という意味になることが多いです。
これを踏まえて、「.」で区切られている単語たちの意味を一つ一つ見ていきましょう。

System:
Javaに標準で用意されているクラス。

out:
Systemの中にある数多の機能の中から、出力に関わる機能を呼び出している。

println():
outが持っているメソッド。()の中に文字列などのデータを入れて使う。

行の区切り文字列を書き込むことで、現在の行を終了させます。
(Java™ Platform Standard Ed. 8より)

本当に抽象的な説明になってしまいますが、日本語化するならば

Javaに標準で用意されているSystemクラスの中で、outという名前が付けられている出力用の機能から、文字列を出力するprintln()というメソッドを呼び出し、"Hello World"という文字列を出力させている。

と言えます。
ちなみに、行の最後に付いているセミコロン(;)は、命令の最後に付けるようにJavaのルールで決められているものです。

まとめ

JavaのHello Worldを一通り説明してみました。
「初心者が一番最初に通る数行のプログラムを非常にざっくりと説明するだけでもここまで難しいのか...」というのが素直な感想です。
間違いや、おかしなところはどんどん指摘していただけるとありがたいです。
ここまで読んでいただいてありがとうございました。

参考文献・サイト

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away