はじめに
この記事は備忘録である。
参考書レベルの内容だが、本記事に掲載するコードについては、
間違えたものが中心となる。これは実際にコーディング中に間違えた部分を掲載し、自分で反省するために投稿するという目的によるもの。
また、後日にJavaSilver試験問題の勉強を兼ねて復習するため、深い部分の話はここでは触れない。
環境
言語:Java11、JDK13.0.2
動作環境:Windows10
Hello,worldとは
プログラミングに触ったことがあれば、必ず誰もが書いたことがあるだろう。僕のおぼろげな記憶だと、中学のコンピューター授業でBasic
かC
で書いたように思う(このときはプログラムの世界に飛び込むとは思わなかった)。ちなみに僕はPython
で「Python3エンジニア認定基礎試験」を受けるための勉強からだったので、コマンドプロンプトからこう書いた。
>>> python
(省略,python3.7.2を起動したときのメッセージ)
>>>print("Hello,world!")
>>>Hello,world! #結果
print
にお願いすればすぐ出た。
そのあとでJavaを読んだら、こうだった。
//まずクラスを作りましょう、から始まった
class helloWorld
{
public static void main(String[] args)
{
System.out.println("Hello,world!");
}
}
//次にコンパイルしましょう。コマンドプロンプト開いてー。
>>>cd C:\JavaSample
//ディレクトリ移動。
//つまり、どこのファイル内にあるか指定してくださいねー。
>>>javac -encoding UTF-8 helloWorld.java
//さぁコンパイルだよー。
//エンコード設定上手くいかないからそこも指定してねー。
//指定したフォルダにコンパイルしたデータが入ったのを確認して。
>>>java helloWorld
Hello,world!
//ようやく完成だ!
……なんだこの手間数?!
これはPythonとJavaの、言語の種類による違いもあるので良し悪しでは語れない(当時は困惑してたが、慣れるものだ)。
とりあえず覚えろ、方式で数書いて覚えたわけだが、問題が残った。
Javaのこれらは、何を意味しているんだ???全く理解出来てないぞ。
なんでこんなに沢山書くんだ?
これら妙に長い記述についての説明が、入門書にはほとんど載っていない(興味本位で少し調べたら後悔した)。「これは枕詞として覚えましょう」というにはいささか長すぎるので、少しは話を入れてほしいと思ったわけだ。
Qiitaにもすでにこの話を扱った方がいらっしゃったので、ひとつ紹介させていただく(3年前の記事であり、現在のJava最新はSE11であることだけ述べておく)。
@tomz65k9nfy
JavaのHelloWorldについて言語仕様を参照しながらの解説に挑戦
また、Javaを扱っている企業のOracle
が出しているリファレンスがこちら。言ってしまえばこのページが理解出来れば説明ができる。
Java® Platform, Standard Edition & Java Development Kit
バージョン11 API仕様
僕なりに、次につなげたい
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)。
public
クラスの外(Hello,world!以外のクラスから何かを呼び出したいとか、その別のクラスの中に格納された数字をいじりたいとか)からアクセスされることをヨシ!とする。そのための宣言。static
インスタンスやオブジェクトと違い、クラスそのものに紐づけされることを宣言するための修飾子。void
メソッドを処理したあと、個々の式によって評価された値を、クラス内部に宣言された変数に代入することが出来る。それを戻り値と呼んでいるが、この
開かれた状態で誰でもウェルカムを表明している。
似た機能だと(制限をかけるほうに向くが)
private
,protected
がある。前回は
mycat
変数によって、僕の猫に固有の特徴量を格納するためのインスタンスを生成した。だがクラスにstatic
で用意されたクラス変数は、クラスそのものにアクセスするときだけに、定めた処理を行う。Catクラスに
static
な処理を施す代表は、固有の猫をインスタンスとして呼び出すたび、「今までに何匹の猫が現れたか」を数えるクラス変数だろう。
void
で宣言したメソッドの場合、戻り値を持たずにいることが出来る。戻り値のないメソッドは、ブロックの処理が終わるか・return文を境に、呼び出された本来のクラスに処理を返す。
つまり
public static void main(String[] args)
とは
修飾:
・他クラスに対してオープンで(public)
・このクラスに紐づけられた(static)
・戻り値を返さない(void)
メソッド:
・String型の配列にargs名を付けたものを引数にとる
・エントリーポイントとしてのメソッド
……なのだろうか?
謎が深まっただけのように、今は思っている。
終わりに
今回は2つに留めたが、「public static void main(String[] args)
」ってなんなのだ?という記事はネット上でもたくさん見かけた。やはり疑問を持つ声が多い事柄のようだ。その疑問をスッキリと説明できるためには、もっと多くの事を知る必要がありそうだ。
プログラムの道は深く、険しい。
参考
出来るだけ自分で変数や式を書いてコンパイルしているので、完全に引用する場合はその旨記述する。
やさしいJava 第7版
Java SE11 Silver 問題集(通称黒本)
Python チュートリアル 第3版(オライリージャパンのストアページなので注意)