初心者から始めるJava、Hello,world!

#はじめに
この記事は備忘録である。
参考書レベルの内容だが、本記事に掲載するコードについては、
**間違えた**ものが中心となる。これは実際にコーディング中に間違えた部分を掲載し、自分で反省するために投稿するという目的によるもの。
また、後日にJavaSilver試験問題の勉強を兼ねて復習するため、深い部分の話はここでは触れない。

##環境
言語：Java11、JDK13.0.2
動作環境：Windows10

#Hello,worldとは
プログラミングに触ったことがあれば、必ず誰もが書いたことがあるだろう。僕のおぼろげな記憶だと、中学のコンピューター授業で`Basic`か`C`で書いたように思う（このときはプログラムの世界に飛び込むとは思わなかった）。ちなみに僕は`Python`で**「Python3エンジニア認定基礎試験」**を受けるための勉強からだったので、コマンドプロンプトからこう書いた。

```Python:Hello,world!.py
>>> python
(省略,python3.7.2を起動したときのメッセージ)
>>>print("Hello,world!")
>>>Hello,world!  #結果
```
`print`にお願いすればすぐ出た。
そのあとでJavaを読んだら、こうだった。

```Java:Hello,world!.java
//まずクラスを作りましょう、から始まった
class helloWorld
{
  public static void main(String[] args)
  {
    System.out.println("Hello,world!");
  }
}
```

```Java:helloWorld.java
//次にコンパイルしましょう。コマンドプロンプト開いてー。
>>>cd C:\JavaSample
   //ディレクトリ移動。
   //つまり、どこのファイル内にあるか指定してくださいねー。
>>>javac -encoding UTF-8 helloWorld.java
   //さぁコンパイルだよー。
   //エンコード設定上手くいかないからそこも指定してねー。

   //指定したフォルダにコンパイルしたデータが入ったのを確認して。
>>>java helloWorld
Hello,world! 
   //ようやく完成だ！

```
……なんだこの手間数？！
これはPythonとJavaの、言語の種類による違いもあるので良し悪しでは語れない（当時は困惑してたが、慣れるものだ）。

とりあえず覚えろ、方式で数書いて覚えたわけだが、問題が残った。
Javaのこれらは、何を意味しているんだ？？？全く理解出来てないぞ。

##なんでこんなに沢山書くんだ？
これら妙に長い記述についての説明が、入門書にはほとんど載っていない（興味本位で少し調べたら後悔した）。「これは枕詞として覚えましょう」というにはいささか長すぎるので、少しは話を入れてほしいと思ったわけだ。
Qiitaにもすでにこの話を扱った方がいらっしゃったので、ひとつ紹介させていただく（3年前の記事であり、現在のJava最新はSE11であることだけ述べておく）。

@tomz65k9nfy
[JavaのHelloWorldについて言語仕様を参照しながらの解説に挑戦](https://qiita.com/tomz65k9nfy/items/351b406f6de74b21ae74)

また、Javaを扱っている企業の`Oracle`が出しているリファレンスがこちら。言ってしまえば**このページが理解出来れば説明ができる**。

[Java® Platform, Standard Edition & Java Development Kit
バージョン11 API仕様](https://docs.oracle.com/javase/jp/11/docs/api/index.html)

#僕なりに、次につなげたい
2つの頼りを挙げさせてもらったが、正直に言って**まだ僕から説明ができるほど呑み込めていない**。だが初心者なりに、次につなげることを書きたいので、あの長い枕詞を分解してみたい。
分解で分けてみる項目は

1.**修飾子とメソッド**
2.**修飾子のそれぞれ**

##分解、修飾子/メソッド
分解対象は
`public static void main(String[] args)`の一文。

1.**修飾子とメソッド**として
`public static void`  /  `main(String[] args)`

前者が**修飾子**3つ、後者が**メソッド**とその引数
ということが分かる。

まずはメソッドについて
`main()`メソッドは、`java.lang.Objectクラス`という、何も宣言していなくてもJavaがあらかじめ用意している**標準クラス**に入っている**処理**である。この`main()`が入っている部分が**エントリーポイント**となって実際の処理が開始され、main()メソッドから抜け出たら処理が終わる。

`(String[] args)`は`main()`メソッドが必要とする引数。**String型の配列**と、`args`という引数名に分かれている。**`args`という名前である必要はない**（別の名前でも構わないが、どうも慣習でこの名前を付けるらしい）。
String型も`java.lang.Objectクラス`の仲間になる（語弊があるが、ここでは割愛）もので、文字列を扱うことが出来る（なおchar型が扱えるのは一部の整数と単体の文字ひとつのみ）。
つまりString型の配列で、argsなり別の名前を付けるなりして、処理を受け取るために用意されているようだ。

次に修飾子(modifier)。
<ul>
<li>`public`</li>クラスの外（Hello,world!以外のクラスから何かを呼び出したいとか、その別のクラスの中に格納された数字をいじりたいとか）からアクセスされることをヨシ！とする。そのための宣言。
開かれた状態で誰でもウェルカムを表明している。
似た機能だと（制限をかけるほうに向くが）`private`,`protected`がある。
<li>`static`</li>インスタンスやオブジェクトと違い、クラスそのものに紐づけされることを宣言するための修飾子。
前回は`mycat`変数によって、僕の猫に固有の特徴量を格納するためのインスタンスを生成した。だがクラスに`static`で用意された**クラス変数**は、クラスそのものにアクセスするときだけに、定めた処理を行う。
Catクラスに`static`な処理を施す代表は、固有の猫をインスタンスとして呼び出すたび、「今までに何匹の猫が現れたか」を数えるクラス変数だろう。

<li>`void`</li>メソッドを処理したあと、個々の式によって評価された値を、クラス内部に宣言された変数に代入することが出来る。それを**戻り値**と呼んでいるが、この`void`で宣言したメソッドの場合、戻り値を持たずにいることが出来る。
戻り値のないメソッドは、ブロックの処理が終わるか・return文を境に、呼び出された本来のクラスに処理を返す。
</ul>
#つまり
`public static void main(String[] args)`とは
修飾：
・他クラスに対してオープンで（public）
・このクラスに紐づけられた(static)
・戻り値を返さない(void)
メソッド：
・String型の配列にargs名を付けたものを引数にとる
・エントリーポイントとしてのメソッド

……なのだろうか？
謎が深まっただけのように、今は思っている。
#終わりに
今回は2つに留めたが、「`public static void main(String[] args)`」ってなんなのだ？という記事はネット上でもたくさん見かけた。やはり疑問を持つ声が多い事柄のようだ。その疑問をスッキリと説明できるためには、もっと多くの事を知る必要がありそうだ。
プログラムの道は深く、険しい。
#参考
出来るだけ自分で変数や式を書いてコンパイルしているので、完全に引用する場合はその旨記述する。

[やさしいJava 第7版](http://mana.on.coocan.jp/yasaj.html)
[Java SE11 Silver 問題集](https://book.impress.co.jp/books/1118101186)（通称黒本）
[Python チュートリアル　第3版](https://www.oreilly.co.jp/books/9784873117539/)(オライリージャパンのストアページなので注意)