[小西ホームページ]   [目次・索引]   [前の授業]   [次の授業]

コンピュータIIIB(Javaアルゴリズム)第3回

目次 索引
3.1 オブジェクト指向プログラミング入門
3.1.1 オブジェクトとは
3.1.2 オブジェクトとメッセージ
3.1.3 クラスとインスタンス
3.1.4 オブジェクトの例
3.2 演習3
3.3 レポート課題
3.4 参考文献
インスタンス変数  インスタンス・メソッド  オブジェクト  オブジェクト指向言語  オブジェクト指向プログラミング  プログラミング・パラダイム  メッセージ 

3.1 オブジェクト指向プログラミング入門

3.1.1 オブジェクトとは

Javaは、 オブジェクト指向言語object-oriented language )に分類されます。 オブジェクト指向プログラミングobject-oriented programming )とは、オブジェクト指向というプログラミング・パラダイムに基づくプログラミングのことです。 ここで、 プログラミング・パラダイムprogramming paradigm )とは、プログラミングの基礎となる考え方のことです。 つまり、オブジェクトを中心にして構成するプログラミングということです。

では、オブジェクトとは何でしょうか。 一言で言えば、 オブジェクトobject )とはある種の構造を持つデータです。 レコード(C言語では構造体)も構造を持つデータですが、レコードが変数のかたまりなのに対して、オブジェクトは変数と関数と手続きのかたまりです。

世界の物理的存在や概念的存在をコンピュータで処理する場合、処理の対象を写し取る、つまりモデル化する必要があります。 このとき、対象の性質を変数に対応させ、対象の機能を関数や手続きに対応させますと、比較的素直にモデル化できます。 処理の対象ごとに、関連性のある変数と関数と手続きをまとめたものがオブジェクトなのです。

Javaでは、オブジェクトの中の変数を インスタンス変数instance variable )とよび、オブジェクトの中の関数と手続きを インスタンス・メソッドinstance method )とよびます。

表 3.1  オブジェクトの対応関係
世界 モデル Java
対象 オブジェクト オブジェクト
性質 変数 インスタンス変数
機能 関数、手続き インスタンス・メソッド

3.1.2 オブジェクトとメッセージ

オブジェクトが変数と関数と手続きのかたまりであることは分かりました。 では、この関数や手続きを呼び出すにはどうすればよいでしょうか。

オブジェクト指向プログラミングでは、オブジェクトは互いに メッセージmessage )を送りあって相互に作用していると考えます。 そして、オブジェクトがメッセージを受け取りますと、それに応じてオブジェクトの中の関数や手続きが呼び出されるのです。 メッセージ自体は単なる記号列ですが、より詳しい情報を送るために引数を持つ場合もあります。

Javaでは、インスタンス・メソッドの名前がメッセージになります。 オブジェクトとメッセージをドット(.)で結びますと、そのオブジェクトにそのメッセージを送ることになります。

3.1.3 クラスとインスタンス

オブジェクトという言葉は、しばしば混乱を招きます。 データの型を意味することもありますし、データ自身を意味することもあります。

オブジェクト指向プログラミングでは、データ型としてのオブジェクトをクラスとよび、データ自身としてのオブジェクトをインスタンスとよびます。 つまり、クラスはインスタンスの集まりであり、インスタンスはあるクラスに属します。

Javaでも、クラスとインスタンスという単語をこの意味で用います。

3.1.4 オブジェクトの例

オブジェクトの例として、カウンタを取り上げます。

カウンタは、ボタンを押すと表示されている数が1増える機械です。 カウンタをモデル化したとき、その性質は数を1つ記憶していることであり、その機能は数が読み取れることと、ボタンが押せることです。 したがって、数の記憶を変数に対応させ、数の読み取りを関数に対応させ、ボタン押しを手続きに対応させます。

カウンタのクラスの名前を Counter とします。 数を読み取るというメッセージを getNumber とします。 ボタンを押したというメッセージを count とします。 すると、カウンタのクラスは次のように定義されます。

Counter.java
/*  1*/ class Counter {
/*  2*/     int number = 0;
/*  3*/     void count () {
/*  4*/         this.number = this.number + 1;
/*  5*/     }
/*  6*/     int getNumber () {
/*  7*/         return this.number;
/*  8*/     }
/*  9*/ }

カウンタのボタンを2回押しますと、2という数が表示されるはずです。 次のプログラムでは、オブジェクト c にボタン押しのメッセージを2回送り、続けて数の読み取りのメッセージを送っています。

CounterMain.java
/*  1*/ class CounterMain {
/*  2*/     public static void main (String[] args) {
/*  3*/         Counter c = new Counter();
/*  4*/         c.count();
/*  5*/         c.count();
/*  6*/         System.out.println(c.getNumber());
/*  7*/     }
/*  8*/ }
b04a001@AsiaA1:~/comp3b% java CounterMain
2
b04a001@AsiaA1:~/comp3b%

3.2 演習3

銀行や郵便局にある番号札発券機について、プログラムを作成してください。

番号札発券機は、呼び出す客の番号と最後の客の番号を記憶しています。 番号札発券機には、呼び出す客の番号と待っている人数が表示されています。 この待っている人数は、最後の客の番号マイナス呼び出す客の番号です。 客がボタンを押しますと、最後の客の番号が1増加して、その番号の札が出てきます。 受付がボタンを押しますと、呼び出す客の番号が1増加します。 ただし、呼び出す客の番号が最後の客の番号を越えることはありません。

今、開店後に2人の客がボタンを押し、次に3人の受付がボタンを押し、続けて1人の客がボタンを押したとします。 3人目の受付の押したボタンは無意味ですので、呼び出す客の番号は2, 待っている人数は1になっているはずです。 このことを、プログラムを作成して実現してください。

ここで、番号札発券機のクラスの名前を TagMachine とします。 客がボタンを押したというメッセージは pushGuest です。 受付がボタンを押したというメッセージは pushClerk です。 呼び出す客の番号を求めるというメッセージは getCalling です。 待っている人数を求めるというメッセージは getWaiting です。

メイン・プログラムは以下の通りとし、クラス TagMachine の定義プログラムを自作してください。

TagMachineMain.java
/*  1*/ class TagMachineMain {
/*  2*/     public static void main (String[] args) {
/*  3*/         TagMachine tm = new TagMachine();
/*  4*/         tm.pushGuest();
/*  5*/         tm.pushGuest();
/*  6*/         tm.pushClerk();
/*  7*/         tm.pushClerk();
/*  8*/         tm.pushClerk();
/*  9*/         tm.pushGuest();
/* 10*/         System.out.println("Calling: " + tm.getCalling());
/* 11*/         System.out.println("Waiting: " + tm.getWaiting());
/* 12*/     }
/* 13*/ }
b04a001@AsiaA1:~/comp3b% java TagMachineMain
Calling: 2
Waiting: 1
b04a001@AsiaA1:~/comp3b%

3.3 レポート課題

今日の演習3の答案をkonishi@twcu.ac.jpあてにメールで送ってください。 メールには、学生番号、氏名、科目名、授業日(10月8日)を明記してください。


3.4 参考文献


[小西ホームページ]   [目次・索引]   [前の授業]   [次の授業]

2004年10月8日更新
konishi@twcu.ac.jp
Copyright (C) 2004 Zenjiro Konishi. All rights reserved.