01 クラスの利用方法

【番外編1】 クラスの利用方法

第9章を読んで頂いた方から、
「どうしても、クラスのことがよくわからない」というご質問をたくさん頂きました。
確かにクラスは、慣れないと分かりにくい概念だと思います。

そこで、番外編として、クラスの利用方法を取り上げましたので、
クラスに慣れていきましょう。

クラスを利用すると何ができるのでしょうか?
クラスを利用することで、同じ性質を持ったものを統一的に扱うことができるようになります。

車を例にとって考えてみましょう。世の中にはいろいろなクルマがありますが、
どれもエンジン、タイヤ、ハンドルをもっている点では共通でしょう。
個々のクルマは、車であるという性質を持つという意味では共通であり、Javaでは、
車をクラスとして扱うことでこの関係を明示的に示すことができるのです。
つまり、クラス=物事の性質をまとめたものであり、物事の雛形 であるということができます。

1. Fileクラスを使ってみよう

前回APIリファレンスの見方を解説したので、皆さんもAPIリファレンスをいくらか読まれたと思います。
今回はその中から、例として、ファイルの性質をもった物質を扱う、Fileクラスを見てみましょう。
Fileクラスは、java.ioパッケージにあります。

まず、「C:\work」フォルダの下に、以下の内容を記述した「test.txt」というファイルを作成します。

test.txt

Hello Java World!

そして同じフォルダ内に、今作成した「test.txt」の情報を調べるためのサンプルプログラムを、
Fileクラスを利用して作成します。
プログラムの内容は以下のとおりです。ファイル名は「FileSample.java」としてください。

FileSample.java

import java.io.File;

public class FileSample
{
    public static void main(String[] args)
    {
        File testFile = new File("test.txt");
        String name = testFile.getName();
        System.out.println(name);

        int size = (int)testFile.length();
        System.out.println(size);

        boolean isWritable = testFile.canWrite();
        System.out.println(isWritable);
    }
}

次に、これを実行してみましょう。
そうすると、以下のような結果が表示されます。

C:\work>javac FileSample.java

C:\work>java FileSample
test.txt
17
true

testFileの後の「getName()」「length()」「canWrite()」というのは、8章でも説明したメソッドです。
ここでは、ファイルの性質として、上から順に、ファイル名、ファイルサイズ、ファイルが
書き込み可能かどうか、を取得しています。実際にプロパティを開いて確認してみましょう。
ファイル名が「test.txt」であること、サイズが17バイトと表示されていること、
読み取り専用にチェックが入っていないこと(つまり書き込み可能であること)が
確認できると思います。

メソッドはクラスに結びついているものです。そして、同じクラスは同じ性質を持っている、
つまり同じメソッドを持っている、ということができます。

ここで、testFileは、具体的なファイル「test.txt」に結びついています。
「test.txt」はもちろんファイルの性質を持っていますから、testFileはFileクラスの
一員であるということが理解できるでしょう。
このtestFileは、Fileクラスのインスタンスと呼ばれるものです。

現時点では、インスタンスとは、あるクラスの性質をもった具体的な物に対応するもので
あると理解しておいてください。
つまり、同じクラスであっても、それぞれのインスタンスは別のものを指します

例を挙げてみましょう。
「C:\work」フォルダの下に、以下の内容で「test2.txt」を作成してください。

test2.txt

Hello World!

そして「FileSample.java」を次の赤字に示すように書き換えます。

import java.io.File;

public class FileSample
{
    public static void main(String[] args)
    {
          File testFile2 = new File("test2.txt");

          String name = testFile2.getName();
          System.out.println(name);

          int size = (int)testFile2.length();
          System.out.println(size);

          boolean isWritable = testFile2.canWrite();
          System.out.println(isWritable);
    }
}

これを実行してみましょう。そうすると、以下のような結果が表示されます。

C:\work>javac FileSample.java

C:\work>java FileSample
test2.txt
12
true

先ほどとは違う結果になりましたね。
testFile2は、上で作成したtestFileと同じフィールドをもっていますし、
同じメソッドで値を取得することができます。
しかし、testFileとtestFile2で取得できるフィールドの値は異なっています。

つまり、testFileとtestFile2は別のものであるということができます。
つまり別のインスタンスであるといえるのです。

これで、Fileクラスを使うことで、ファイルという概念を
プログラムの要素として扱えるようになったことがわかると思います。
Fileクラスの一員(インスタンス)であること=同じ要素、能力をもっている
ということが理解できたでしょうか?

2. StringBufferクラスを使ってみよう

これまでは、ファイルという比較的具体的にイメージできる例を扱いました。
ほかの例を見てみましょう。

Javaでは文字列を扱うクラスとして、これまでに利用してきたStringとは別に
StringBufferクラスというものも利用できます。

それでは、実際にStringBufferクラスを使用するサンプルプログラムを作成してみましょう。
「StringBufferSample.java」というファイル名で、以下のプログラムを作成して下さい

StringBufferSample.java

public class StringBufferSample
{
    public static void main(String[] args)
    {
        StringBuffer strBuffer = new StringBuffer("test");
        int size1 = (int)strBuffer.length();
        System.out.println(size1);

        strBuffer.append("test2");
        int size2 = (int)strBuffer.length();
        System.out.println(size2);

        System.out.println(strBuffer.toString());
    }
}

次に、これを実行してみましょう。
そうすると、以下のような結果が表示されます。

C:\work>javac StringBufferSample.java

C:\work>java StringBufferSample
4
9
testtest2

ここでは、「length()」「append()」というメソッドを使用しています。
順に、文字列の長さを取得する、文字列を連結する、という操作を表しています。
ここで注意してほしいのは、これまでの例とは違い、メソッド「append()」で
インスタンスstrBufferの要素を変更しています。
これは、メソッド「length()」の値が変わっていることでも分かると思います。

なお、メソッド「toString()」は、クラスStringBufferをクラスStringに変換するメソッドです。
ここでは、System.out.println()で文字列の内容を表示するために利用しています。
このように、メソッドを用いることによってクラス同士に関連性を持たせることも
できるようになるのです。

StringBufferクラスには、他にもたくさんのメソッドがあります。
ぜひ、APIリファレンスで確認してみてください。

それでは、今回の講座の内容をまとめてみましょう。

~ まとめ ~

1.クラスは、特定の性質を持ったものを扱う概念であることがわかった
2. 同じクラスは、同じ能力を持っていることがわかった
3. メソッドがクラスに結びついているものであることがわかった