インスタンス

C言語ではmain関数ありきで、プログラムはmain関数から始まり、main関数の中で変数を宣言しながら様々な関数を呼び出しました。
つまり、プログラムは関数を中心に構成されていたと言えます。

これに対してJavaは、クラスを中心にプログラムを構成します。
全ての値(データ)や関数は何れかのクラスに属しており、例外はありません。
よって、mainメソッド(main関数に相当)も含めて全てクラスに属する必要があります。
また、原則として全てのデータや関数(メソッド)はクラスを通して処理されます。

メソッド

Javaでは関数のことをメソッドと呼びます。
「与えられた引数(情報)を元に処理を実行し、戻り値(結果)を返す」という意味では関数とメソッドは同じものです。
しかし、一般的にメソッドと言う場合はクラスに属する関数を指し、関数と言った場合はクラスに属さない関数(グローバル関数)を指します。
Javaでは関数(グローバル関数)は作ることはできません。

グローバル関数はプログラムのどこからでも使用することができる為、グローバル関数が使えないということは不便のように思えるでしょう。
しかし、どこからでも使えるという事は、逆にどこから使われても良いように考慮しなくてはならないとも言えます。

インスタンス

C言語では変数や構造体を使用する時、変数や構造体を宣言しメモリ上に領域を確保するという手順を踏みました。
これはコンピュータに処理をさせる上で原始的な言語であっても今後開発される未知の言語であっても手順は違えど変わらないものと言えます。

Javaではクラスを使用する場合、メモリ上に領域を確保することは共通していますが、これをインスタンスの生成と呼びます。
インスタンスの生成にはnew演算子を用い、以下のように記述します。
[インスタンスの生成]

    new クラス名();

このようにnew演算子を用いクラス名を記述することでインスタンスが生成されます。
このクラス名()の部分は、コンストラクタと呼ばれる特殊なメソッドです。
クラスのインスタンスが生成される時、必ずコンストラクタが呼ばれ、インスタンスが生成されます。

インスタンスとはクラスという概念を実体化したものです。
クラスが設計図だとすれば、設計図を元に生成された製品がインスタンスというイメージです。

HelloWorld

それでは遂にHelloWorldの登場です。
example02パッケージにHelloWorldクラスを作成し、コードを追加していきます。
[HelloWorld.java]

package example02;

public class HelloWorld {

    HelloWorld()
    {
    }

    void helloWorld()
    {
        System.out.println("Hello World!");
    }

    public static void main(String[] args)
    {
        (new HelloWorld()).helloWorld();
    }
}

コードを記述したならばとりあえずは実行してみてください。
コンソールに「Hello World!」と表示されるでしょう!

パッケージの宣言
package example02;

ソースファイルの先頭にはパッケージ文と呼ばれる1行を記述します。
この場合、このクラスがexample02パッケージに存在するという宣言です。
当然ながらパッケージ文を複数記述することはできません。

クラスの宣言
public class HelloWorld {
    
}

public classで始まる箇所がクラス宣言であり、{}囲われた部分(スコープ)がクラスの範囲となります。
publicは予約語と呼ばれ特別な意味を持ちますが、今はオマジナイと思っていて下さい。

コンストラク
    HelloWorld()
    {
    }

この戻り値のないメソッドがコンストラクタです。
コンストラクタの名前は、クラス名と大文字小文字を含めて同じである必要があります(パッケージ名は不要)。
また、戻り値は記述できません。

戻り値を記述したならばそれはメソッドとして認識されるので注意しましょう。
また、コンストラクタの名前がクラス名と異なる場合はコンパイルエラーとなります。

メソッド
    void helloWorld()
    {
        System.out.println("Hello World!");
    }

メソッドは戻り値+メソッド名で記述されます(必要に応じて引数を記述する)。
C言語の関数と同じように特に戻り値が不要の場合は、void型を戻り値型として指定します。
メソッド名は、helloWorldというようにキャメルケースで記述します。
キャメルケースはクラス名(パスカルケース)のように単語ごとに頭文字を大文字としますが、先頭は小文字で表記する記法です。

メソッドに書かれた処理は"Hello World!"という文字列を標準出力に出力するものです。
今はこのように書けばprintf関数のようにコンソール出力できると理解しておきましょう。

mainメソッド

    public static void main(String[] args)
    {

    }

C言語と似ていますが、細かいところは異なるので注意してください。
まず戻り値はintではなくvoidとなります。
次に引数の書き方が異なりますが、今はこのように記述する必要があると思ってください。
また、public static というオマジナイも必須です。

これらの違いはJavaの仕様です。
すべてmainメソッドに必要なものですが、今はmainメソッドの雛形として理解しておきましょう。

インスタンスの生成とメソッドの呼び出し
        (new HelloWorld()).helloWorld();

この一行はJavaの基礎となる重要な処理ですが、「new HelloWorld()」と「().helloWorld()」の2つの部分に分けて理解する必要があります。

まず、「new HelloWorld()」は、HelloWorldクラスのインスタンスの生成を行います。
これにより、HelloWorldクラスの情報を元にして、メモリ領域の一部が確保されます。

次の「().helloWorld()」ですが、これは「HelloWorldクラスのインスタンス.helloWorld()」ということになります。
この.(ドット)はドット演算子と呼ばれ、続けてhelloWorld()というメソッドが記述されています。
このドット演算子インスタンスに対しデータやメソッドを処理させる為に使用します。

従って、この1文は「HelloWorldのインスタンスを生成し、そのインスタンスのhelloWorld()メソッドを実行」となるのです。

尚、HelloWorldクラスの正式名称(完全修飾クラス名)はexample.HelloWorldクラスなのですが、「同一パッケージのクラスで利用される場合はパッケージ名を省略できる」というルールがある為、省略してHelloWorldと書くことができます。

        new example.HelloWorld();

と書いた場合でも同様にHelloWorldクラスのインスタンスが生成されます。

このようにJavaでは全てのメソッドを実行するためには、原則としてインスタンスを作成してから、インスタンスに対してメソッドの実行を指示しなくてはなりません。
サンプルのような簡単なプログラムではこの書き方は冗長になり解りにくくなりますが、様々なメリットがあります。

もう1つのHelloWorld

ほとんどの入門書では、JavaのHelloWorldは以下のように書かれているかと思われます。

public class HelloWorld {

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

このHelloWorldとこの講座のHelloWorldは実行結果だけを見れば同じです。
これは間違いではありませんが、Javaではインスタンスを生成することと、インスタンスのデータやメソッドを処理するということが重要であると考えて採用しませんでした。

演習2.3

  1. クラス名を変更してコンパイルエラーとなる事を確認しなさい。
  2. コンストラクタの名前を変更してコンパイルエラーとなる事を確認しなさい。