先頭に戻る

8.クラスとは

8-1 「クラスとは?」

はじめに

前章でもクラスについて説明しましたが、この章ではプログラミングを絡めながらクラスについて説明していきます。


データの扱い

下のプログラムを見てみましょう。

Kouza.java


// 1.二人分の銀行口座データを扱うプログラム class Kouza { public static void main(String[] args) { String tanakaAccountName = "田中太郎"; // 田中君の口座名義 String tanakaAccountNo = "123456"; //  〃 の口座番号 long tanakaAccountBalance = 1000; //  〃 の預金残高 String yamadaAccountName = "山田新一"; // 山田君の口座名義 String yamadaAccountNo = "654321"; //  〃 の口座番号 long yamadaAccountBalance = 200; //  〃 の預金残高 tanakaAccountBalance -= 200; // 田中君が200円おろす yamadaAccountBalance += 100; // 山田君が100円預ける System.out.println("■田中君の口座"); System.out.println(" 口座名義:" + tanakaAccountName); System.out.println(" 口座番号:" + tanakaAccountNo); System.out.println(" 預金残高:" + tanakaAccountBalance); System.out.println("■山田君の口座"); System.out.println(" 口座名義:" + yamadaAccountName); System.out.println(" 口座番号:" + yamadaAccountNo); System.out.println(" 預金残高:" + yamadaAccountBalance); } }
実行結果

■田中君の口座
口座名義:田中太郎
口座番号:123456
預金残高:800
■山田君の口座
口座名義:山田新一
口座番号:654321
預金残高:300



解説

このプログラムは2人分の銀行口座データを6個の変数で表しています。例えば、 tanakaAccountNameは口座名義、tanakaAccountNoは口座番号、tanakaAccountBalanceは預金残高です。

しかし、このプログラムには少し問題があります。名前がyanadaで始まる変数は山田くんの銀行口座に関係有るものである と推測できます。しかし、田中くんの銀行口座をyamadaAccountNameと表したり、山田さんの銀行口座をtanakaAccountName とあわわす事も可能です。問題は、変数間の関係を変数名から推測はできますが、確定はできません。バラバラに宣言された 口座名義、口座番号、預金残高の変数が1つの銀座口座に関するものである関係はプログラム上で表現されていません。

そこで前章で学習したクラスを用います。クラスは現実世界のオブジェクト(物)や概念を プログラムの世界のオブジェクト(変数)に投影します。イメージとしては以下の動画のとおりです。


動画にあるように、プログラムで扱う問題の種類などによっても異なりますが、現実の世界からプログラムの世界への投影は まとめるべきものはまとめる、本来まとまっているものはそのままにすると言った方針にのっとるとより自然で素直なものとなります。 動画にある2.KouzaTest.javaがクラスを使ったプログラムになります。

KouzaTest.java


// 2.二人分の銀行口座データを扱うプログラム

class Kouza { String name; // 口座名義 String no; // 口座番号 long balance; // 預金残高 }

// 銀行口座クラスをテストするクラス class KouzaTest { public static void main(String[] args) {

Kouza tanaka = new Kouza(); // 田中君の口座 Kouza yamada = new Kouza(); // 山田君の口座

tanaka.name = "田中太郎"; // 田中君の口座名義 tanaka.no = "123456"; //  〃 の口座番号 tanaka.balance = 1000; //  〃 の預金残高 yamada.name = "山田新一"; // 山田君の口座名義 yamada.no = "654321"; //  〃 の口座番号 yamada.balance = 200; //  〃 の預金残高 tanaka.balance -= 200; // 田中君が200円おろす yamada.balance += 100; // 山田君が100円預ける

System.out.println("■田中君の口座"); System.out.println(" 口座名義:" + tanaka.name); System.out.println(" 口座番号:" + tanaka.no); System.out.println(" 預金残高:" + tanaka.balance); System.out.println("■山田君の口座"); System.out.println(" 口座名義:" + yamada.name); System.out.println(" 口座番号:" + yamada.no); System.out.println(" 預金残高:" + yamada.balance); } }
実行結果

■田中君の口座
口座名義:田中太郎
口座番号:123456
預金残高:800
■山田君の口座
口座名義:山田新一
口座番号:654321
預金残高:300



解説

このプログラムも先ほどと同じように2人分の銀行口座データを6個の変数で表しています。 違いは、クラスを用いているということです。口座の1側面ではなく複数の側面に着目し、口座名義と当座番号、預金残高を ひとまとめにしたオブジェクトとして投影したのがクラスの考え方です。

本プログラムは、2つのクラスから構成されており、これまでのプログラムとは異なります。 それぞれのクラスの概略は以下のとおりです。

Kouza : 銀行クラス
KouzaTester : クラスKouzaをテストするクラス

これまでのプログラムはmainメソッドを中心とする構造でしたが今回のプログラムではKouzaTestがそれに相当します。 プログラム実行時にはこのプログラムの中のmainメソッドが実行されます。(// 銀行口座クラスをテストするクラスのこと。 )

ソースプログラムのファイルもこのクラスに拡張子.javaになるため、KouzaTest.javaであって、 Kouza.javaではありませんので注意して下さい。

まず、①部分でクラスKouzaが「口座名義」、「口座番号」、「預金残高」をセットにしたものである ことを表すための宣言になっています。「class Kouza{ 」が宣言の開始で「 }」まで続き、このような宣言を クラス宣言と呼びます。「{ }」の中に置かれているクラスを構成するデータを表すものをフィールドと呼びます。 今回のクラスKouzaは

・口座名義を表す String型の name
・口座番号を表す String型の no
・預金残高を表す Long型の balance

といった3つのフィールドから構成されています。

クラス宣言は「型」を宣言するものであり、実体(変数)を表すものではありません。 そのため、クラスKouza型の変数は、

Kouza tanaka; //田中くんの口座
Kouza yamada; //山田くんの口座

のように宣言します。しかし、この宣言で作られるtanakaとyamadaは銀行クラスの 実体ではなく参照するためのクラス型変数というものです。

前章で学習したとおり、クラスはたこ焼きを焼くための「カタ」のようなものです。 本物のそのため、たこ焼きである実体は別に生成しなければなりません。配列の場合と同じように、 クラスの本体の「実体(たこ焼き)」の生成は「new演算子」を利用し、

new Kouza()

と表します。

重要

new演算子により生成されたクラス型の「実体(たこ焼き)」をインスタンスと呼び、インスタンスを生成することを インスタンス化と呼びます。また、クラス型変数とインスタンスは関連付けが必要なため、

tanaka = new Kouza();
yamada = new Kouza();

と代入しなければなりません。これでtanakaやyamadaは生成されたインスタンスを参照できるようになります。今までの作業を表したものが下の絵になります。 また、動画も確認しここまでの復習一度しておきましょう。




解説

クラスKouza型のインスタンスは口座名口座番号預金残高がセットになった変数です。 プログラムの中に「tanaka.name」という物がありますが、これは特定のフィールドをアクセスするために利用するための メンバアクセス演算子(ドット演算子)というものです。

x . y //xが参照するインスタンス内のメンバ(要素)yをアクセスする。

簡単にいえば「tanaka.name」は「田中君口座名義」、「tanaka.no」は、「田中君口座番号」というように、 日本語の「の」と同じ役割をします。本プログラムでは以下のようになります。


tanaka.name 	//田中君の名義
tanaka.balance 	//田中君の口座番号
tanaka.balance 	//田中君の預金残高
yamada.name //山田君の名義 yamada.no //山田君の口座番号 yamada.balance //山田君の預金残高

重要

インスタンス内の個々のフィールドであるインスタンスう変数はメンバアクセス演算子を利用することでアクセスが可能になる。