目次 | 索引 |
---|---|
Javaは、 オブジェクト指向言語 ( object-oriented language )に分類されます。 オブジェクト指向プログラミング ( object-oriented programming )とは、オブジェクト指向というプログラミング・パラダイムに基づくプログラミングのことです。 ここで、 プログラミング・パラダイム ( programming paradigm )とは、プログラミングの基礎となる考え方のことです。 つまり、オブジェクトを中心にして構成するプログラミングということです。
では、オブジェクトとは何でしょうか。 一言で言えば、 オブジェクト ( object )とはある種の構造を持つデータです。 レコード(C言語では構造体)も構造を持つデータですが、レコードが変数のかたまりなのに対して、オブジェクトは変数と関数と手続きのかたまりです。
世界の物理的存在や概念的存在をコンピュータで処理する場合、処理の対象を写し取る、つまりモデル化する必要があります。 このとき、対象の性質を変数に対応させ、対象の機能を関数や手続きに対応させますと、比較的素直にモデル化できます。 処理の対象ごとに、関連性のある変数と関数と手続きをまとめたものがオブジェクトなのです。
Javaでは、オブジェクトの中の変数を インスタンス変数 ( instance variable )とよび、オブジェクトの中の関数と手続きを インスタンス・メソッド ( instance method )とよびます。
世界 | モデル | Java |
---|---|---|
対象 | オブジェクト | オブジェクト |
性質 | 変数 | インスタンス変数 |
機能 | 関数、手続き | インスタンス・メソッド |
オブジェクトが変数と関数と手続きのかたまりであることは分かりました。 では、この関数や手続きを呼び出すにはどうすればよいでしょうか。
オブジェクト指向プログラミングでは、オブジェクトは互いに メッセージ ( message )を送りあって相互に作用していると考えます。 そして、オブジェクトがメッセージを受け取りますと、それに応じてオブジェクトの中の関数や手続きが呼び出されるのです。 メッセージ自体は単なる記号列ですが、より詳しい情報を送るために引数を持つ場合もあります。
Javaでは、インスタンス・メソッドの名前がメッセージになります。 オブジェクトとメッセージをドット(.)で結びますと、そのオブジェクトにそのメッセージを送ることになります。
オブジェクトという言葉は、しばしば混乱を招きます。 データの型を意味することもありますし、データ自身を意味することもあります。
オブジェクト指向プログラミングでは、データ型としてのオブジェクトをクラスとよび、データ自身としてのオブジェクトをインスタンスとよびます。 つまり、クラスはインスタンスの集まりであり、インスタンスはあるクラスに属します。
Javaでも、クラスとインスタンスという単語をこの意味で用います。
オブジェクトの例として、カウンタを取り上げます。
カウンタは、ボタンを押すと表示されている数が1増える機械です。 カウンタをモデル化したとき、その性質は数を1つ記憶していることであり、その機能は数が読み取れることと、ボタンが押せることです。 したがって、数の記憶を変数に対応させ、数の読み取りを関数に対応させ、ボタン押しを手続きに対応させます。
カウンタのクラスの名前を
Counter
とします。
数を読み取るというメッセージを
getNumber
とします。
ボタンを押したというメッセージを
count
とします。
すると、カウンタのクラスは次のように定義されます。
/* 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回送り、続けて数の読み取りのメッセージを送っています。
/* 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%
銀行や郵便局にある番号札発券機について、プログラムを作成してください。
番号札発券機は、呼び出す客の番号と最後の客の番号を記憶しています。 番号札発券機には、呼び出す客の番号と待っている人数が表示されています。 この待っている人数は、最後の客の番号マイナス呼び出す客の番号です。 客がボタンを押しますと、最後の客の番号が1増加して、その番号の札が出てきます。 受付がボタンを押しますと、呼び出す客の番号が1増加します。 ただし、呼び出す客の番号が最後の客の番号を越えることはありません。
今、開店後に2人の客がボタンを押し、次に3人の受付がボタンを押し、続けて1人の客がボタンを押したとします。 3人目の受付の押したボタンは無意味ですので、呼び出す客の番号は2, 待っている人数は1になっているはずです。 このことを、プログラムを作成して実現してください。
ここで、番号札発券機のクラスの名前を
TagMachine
とします。
客がボタンを押したというメッセージは
pushGuest
です。
受付がボタンを押したというメッセージは
pushClerk
です。
呼び出す客の番号を求めるというメッセージは
getCalling
です。
待っている人数を求めるというメッセージは
getWaiting
です。
メイン・プログラムは以下の通りとし、クラス
TagMachine
の定義プログラムを自作してください。
/* 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の答案をkonishi@twcu.ac.jpあてにメールで送ってください。 メールには、学生番号、氏名、科目名、授業日(10月8日)を明記してください。