LoginSignup
0
0

More than 3 years have passed since last update.

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

Posted at

はじめに

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

環境

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

Hello,worldとは

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

Hello,world!.py
>>> python
(省略,python3.7.2を起動したときのメッセージ)
>>>print("Hello,world!")
>>>Hello,world!  #結果

printにお願いすればすぐ出た。
そのあとでJavaを読んだら、こうだった。

Hello,world!.java
//まずクラスを作りましょう、から始まった
class helloWorld
{
  public static void main(String[] args)
  {
    System.out.println("Hello,world!");
  }
}
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について言語仕様を参照しながらの解説に挑戦

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

  • void
  • メソッドを処理したあと、個々の式によって評価された値を、クラス内部に宣言された変数に代入することが出来る。それを戻り値と呼んでいるが、この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版(オライリージャパンのストアページなので注意)

0
0
1

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
0
0