...

オブジェクト指向プログラミング Java 7版

by user

on
Category: Documents
9

views

Report

Comments

Transcript

オブジェクト指向プログラミング Java 7版
好評発売中 !
Javaバイブルシリーズ
Java入門 Java7版
●B5変 371頁
●定価(本体2,000円+税)
2012年 3 月発売 !
Javaバイブルシリーズ
Webアプリケーション構築
Java7版
●B5変 約350頁
●定価(本体2,800円+税)
好評発売中 !
HTML演習
HTML5対応版
著者:中島省吾
●B5変 305頁
●定価(本体2,000円+税)
(本体 2,000 円+税)
203374_Obj_INTRO+TOC_Qx3_121227 13.2.8 16:48 ページ ii
●
OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国にお
ける登録商標です。
●
Windowsは米国Microsoft Corporationの米国およびその他の国における登録商標です。
●
その他記載された会社名およびロゴ、製品名などは該当する各社の商標または登録商標です。
●
本書では™および®の記載は省略しました。
203374_Obj_INTRO+TOC_Qx3_121227 2/8/13 4:48 PM ページ i
はじめに
本書は、近年注目を浴びているオブジェクト指向の概要と、その実現方法のひとつとして普及し始めた
Javaプログラムについてまとめたものです。
オブジェクト指向は名称こそある程度ポピュラーになりましたが、その応用範囲の広さもあり、いまひとつ
捉えどころの無いものになっています。本書では可能な限り平易な表現とサンプルを使用することで、オ
ブジェクト指向のひととおりのトピックを理解してもらうことを目的にしました。本来であれば、本書で取り
上げるいくつかの項目だけで十分一冊の解説書になり得るボリュームです。本書によりオブジェクト指向
の世界に興味を持たれた方は、ぜひ次のステップに進んでください。
本書の各章では以下の項目を学びます。
第1章―学習を始めるにあたって
第2章―オブジェクト指向とは何か
第3章― Javaプログラムの基本
第4章― Javaプログラムの概念
第5章― Javaプログラムの活用
第6章― Javaプログラムの形態
第7章―ステップアップ演習
第8章― Java SE 7の新機能
本書が少しでもみなさんの勉強の手助けになれば幸いです。
i
203374_Obj_INTRO+TOC_Qx3_121227 2/8/13 4:48 PM ページ ii
サポート情報/サンプルプログラム
本書に記載された項目に関する最新情報や、サンプルプログラムなどを、必要に応じて公開しています。
http://www.scc-kk.co.jp/scc-books/support/B-363/support.html
標準学習時間
内容
1. 学習を始めるにあたって
範囲
学習時間
(1時限=90分)
1ページ ∼ 14ページ
2.0時限
2. オブジェクト指向とは何か
15ページ ∼ 32ページ
3.0時限
3. Javaプログラムの基本
33ページ ∼ 83ページ
5.0時限
4. Javaプログラムの概念
85ページ ∼ 187ページ
12.0時限
5. Javaプログラムの活用
189ページ ∼ 311ページ
12.0時限
6. Javaプログラムの形態
313ページ ∼ 331ページ
3.0時限
7. ステップアップ演習
333ページ ∼ 391ページ
8.0時限
8. Java SE 7の新機能
393ページ ∼ 402ページ
3.0時限
総合演習
403ページ ∼ 414ページ
15.0時限
合計
65.0 時限 学習時間はあくまでも目安です。理解度に合わせて、さらに時間をかけて学習しても構いません。逆にこ
の学習時間はプログラミング経験のない読者を想定していますので、他の言語を学習した経験のある人
は、もっと早く学習を進められるはずです。
本書の例題を参考に各自でプログラムを変更し、さまざまなパターンを試してみるとより理解が深まると思
います。
プログラムのソースコード
本書ではソースコードがどこにあるかがひと目でわかるように、ソースコードに背景色を付けています。ま
た、ソースコードで使用する文字で紛らわしいものに関しては以下のように区別しやすい形にしてあります。
ii
表記
意味
1
数字の1
(イチ)
l
英小文字のl
(エル)
I
英大文字のI
(アイ)
0
数字の0
(ゼロ)
o
英小文字のo
(オー)
O
英大文字のO
(オー)
標準学習時間
203374_Obj_INTRO+TOC_Qx3_121227 2/8/13 4:48 PM ページ iii
ナビゲーションマップ
本書の構成は、各章を順番に学習することでJava言語の文法とオブジェクト指向プログラミングのしく
みが無理なく理解できる流れになっています。また本書の特徴として、順番に進めていけば各学習項目が
ひとつずつ出てくるようになっています
(例題の中に学習していない項目が極力入らないようにしてありま
す)
。したがって基本的には以下に示す「標準モード」で学習を進めてください。
前提知識―プログラミング経験なし
学習目標―Java言語の基本文法とオブジェクト指向プログラミングのしくみを理解する
第1 章
学習の準備とJavaプログラムの動作原理を学習します
第2 章
オブジェクト指向の特徴を学習します
第3 章
Java言語の基本文法を学習します
第4 章
オブジェクト指向としての基本概念を学習します
第5 章
Java を活用するための項目を学習します
第6 章
アプリケーション以外の Java プログラムの形態を学習します
第7 章
ひとつのテーマを通してこれまでの学習項目を復習します
第8 章
Java SE 7 で追加された機能について学習します
総合演習
GUI を含むデータベースアプリケーションを作成します
ナビゲーションマップ
iii
203374_Obj_INTRO+TOC_Qx3_121227 2/8/13 4:48 PM ページ iv
目次
第1章 学習を始めるにあたって ................................................................................ 1
1.1 Java SDKのインストールと環境設定 .......................................................................... 2
1.2 Javaプログラムの作成と実行の方法 ......................................................................... 5
1.3 Javaプログラムの動作原理 ..................................................................................... 11
第2章 オブジェクト指向とは何か............................................................................ 15
2.1 オブジェクト指向出現の背景 .................................................................................... 16
2.2 オブジェクト指向概要 ............................................................................................... 18
2.3 オブジェクト指向の特徴とメリット............................................................................... 21
確認問題01 .................................................................................................................. 31
第3章 Javaプログラムの基本............................................................................... 33
3.1 基本的なJavaプログラムの構造 .............................................................................. 34
確認問題02 .................................................................................................................. 39
3.2 型と定数/変数....................................................................................................... 40
確認問題03 .................................................................................................................. 45
3.3 文字と文字列 .......................................................................................................... 47
確認問題04 .................................................................................................................. 49
3.4 配列 ........................................................................................................................ 50
確認問題05 .................................................................................................................. 54
3.5 演算子 .................................................................................................................... 55
確認問題06 .................................................................................................................. 65
3.6 制御構造................................................................................................................. 67
確認問題07 .................................................................................................................. 82
第4章 Javaプログラムの概念............................................................................... 85
4.1
Javaプログラムにおけるクラス ................................................................................ 86
4.2
newを使用したインスタンスの生成 .......................................................................... 91
確認問題08 .................................................................................................................. 93
4.3
複数のクラスを使用する.......................................................................................... 95
確認問題09 .................................................................................................................. 97
iv
目次
203374_Obj_INTRO+TOC_Qx3_121227 2/8/13 4:48 PM ページ v
4.4
引数/戻り値を使用する......................................................................................... 99
確認問題10 ................................................................................................................ 104
4.5
クラスメソッド........................................................................................................ 106
確認問題11 ................................................................................................................ 111
4.6
インスタンス変数とクラス変数 ............................................................................... 113
確認問題12 ................................................................................................................ 116
4.7
オーバーロード ...................................................................................................... 118
確認問題13 ................................................................................................................ 123
4.8
継承..................................................................................................................... 125
確認問題14 ................................................................................................................ 133
4.9
オーバーライド ...................................................................................................... 137
確認問題15 ................................................................................................................ 143
4.10 抽象クラス............................................................................................................ 145
確認問題16 ................................................................................................................ 149
4.11 インタフェース ....................................................................................................... 153
確認問題17 ................................................................................................................ 162
4.12 ポリモルフィズム ................................................................................................... 165
確認問題18 ................................................................................................................ 174
4.13 コンストラクタ ....................................................................................................... 178
確認問題19 ................................................................................................................ 185
第5章
Javaプログラムの活用 ............................................................................ 189
5.1
パッケージ ............................................................................................................ 190
確認問題20 ................................................................................................................ 195
5.2
インポート............................................................................................................. 198
確認問題21 ................................................................................................................ 201
5.3
修飾子と可視性.................................................................................................... 202
確認問題22 ................................................................................................................ 210
5.4
例外処理.............................................................................................................. 213
確認問題23 ................................................................................................................ 225
5.5
スレッド処理 ......................................................................................................... 227
確認問題24 ................................................................................................................ 234
5.6
コレクションクラスとGenerics............................................................................... 239
確認問題25 ................................................................................................................ 257
目次
v
203374_Obj_INTRO+TOC_Qx3_121227 2/8/13 4:48 PM ページ vi
5.7
キーボード入力とファイルI/O ................................................................................. 261
確認問題26 ................................................................................................................ 270
5.8
データベースアクセスとJDBC ................................................................................ 272
確認問題27 ................................................................................................................ 290
5.9
GUIとイベント処理................................................................................................ 294
確認問題28 ................................................................................................................ 309
第6章
Javaプログラムの形態 ............................................................................ 313
6.1
アプレット ............................................................................................................. 314
確認問題29 ................................................................................................................ 325
6.2
サーブレット .......................................................................................................... 328
第7章
ステップアップ演習.................................................................................. 333
7.1
ステップ1 クラスの定義 ...................................................................................... 335
7.2
ステップ2 インスタンスの生成 ............................................................................. 338
7.3
ステップ3 アクセッサを装備したカプセル化 .......................................................... 340
7.4
ステップ4 継承による拡張 .................................................................................. 352
7.5
ステップ5 インタフェースの追加........................................................................... 364
7.6
ステップ6 オーバーロード/オーバーライドの実現 ................................................ 379
第8章
Java SE 7の新機能 ............................................................................... 393
8.1
Java SE 7............................................................................................................ 394
8.2
数値リテラル表現の拡張 .................................................................................... 395
8.3
switch文の文字列判定......................................................................................... 397
8.4
Genericsの省略記法 ........................................................................................... 398
8.5
例外処理の改善................................................................................................... 399
8.6
リソース管理用構文の追加................................................................................. 401
総合演習............................................................................................................... 403
索引
vi
目次
................................................................................................................ 415
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 1
第1章
学習を始めるにあたって
これからみなさんと一緒にJavaによるプログラミングを学習していきますが、プロ
グラミングの勉強というのは実際に動かしてみないと楽しくありません。そこでまず
最初にこれから本書の中で使用するJavaの開発環境および実行環境について
説明します。
現在、Javaによるプログラム開発にはさまざまなツールが存在します。本書ではこ
の中から比較的手に入りやすく、かつ無償で使用することができるJDKというツー
ルを使用します。Java SDKというのはJavaの開発元であるオラクル社が提供
しているJavaの開発および実行をサポートするプログラム群であり、現在さまざま
なOS用のものが提供されています。また、よりよいものにするため日々バージョン
アップが続けられています。
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 2
1.1
1
Java SDKのインストールと環境設定
これからみなさんと一緒にJavaによるプログラミングを学習していきます。まずはJavaを使用して
プログラムを作成するための環境設定についてお話します。
それでは実際にJavaの環境設定を始めましょう。最新のJava SDKはJava テクノロジーのホームペー
ジ(http://java.com)
からダウンロードできます。ここにはMicrosoft Windows( 以降 Windows)
をはじめとして、さまざまな種類の OS 用に Java の開発環境が用意されており、無償でダウンロード
でき使用することができます。今回使用するWindows 用の開発環境をセットにしたファイル名は
jdk-XXXXXX-windows-i586.exe(32bit版)
または、jdk-XXXXXX-windows-x64.exe(64bit版)
と
いう形式になっており、XXXXXXの部分にはバージョンが入ります。
このファイルをダウンロードしてデスクトップ上に置いてください。次にこのファイルをダブルクリックし実行
します。そうするとインストールプログラムが起動するはずです。インストールにはいくつかのオプションが
選択できますが、ここではすべてデフォルトのまま、
『次へ』ボタンで進むことにしましょう。
みなさんはWindows用のプログラムというと、ワードやエクセルのようなものを想像すると思います。とこ
ろがこのJava SDKはWindowsのコマンドプロンプトという機能の中で実行されます。ワードやエクセ
ルと比較すると地味な画面ですが、しばらく我慢してください。
さてこのコマンドプロンプトの画面でプログラムを実行するには、いくつかの環境設定が必要となります。
その中でも最低限行っておかなければいけないのが環境変数の設定です。つまりJava SDKのプログラ
ムの場所をWindowsに教えてあげる必要があります。
Windows-XPの場合はコントロールパネルを開き、システムというアイコンをダブルクリックしてください。
するとシステムのプロパティというウィンドウが開くはずです。
2
第1章 学習を始めるにあたって
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 3
次に「詳細設定」のタブをクリックし、そのページの
[環境変数]
をクリックしてください。
1
「システム環境変数」のリストから
「Path」
と書かれている行を選択し、
[編集]をクリックします。
変数値の行の最後に、あなたのハードディスクにインストールされたJava SDKの場所を追加します。た
とえば今回インストールしたバージョンが「1.7.0_04」であったとすると、追加する文字列は、
C:¥Program Files¥Java¥jdk1.7.0_04¥bin
となります。このとき注意することは、既に入っている文字列を消してしまわないことと、追加する文字列
の前に1文字「;」
を入れることです。この「;」
は各文字列の区切りを意味します。
1.1
JDKのインストールと環境設定
3
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 4
これでひととおりの設定が完了しました。後はそれぞれのウィンドウを『OK』ボタンで閉じれ
ば終了です。Javaによるプログラム開発ができるようになっているはずです。
設定が正しく行われたことを確認する方法をご紹介しましょう。再起動後、コマンドプロンプトの画面で
javacと入力し、[Enter]キーを押してみてください。
1
上記の様な説明の画面が出れば成功です。さあプログラムの勉強を始めましょう。
もし以下の様な画面になった場合は、設定がうまくいっていないようです。もう一度確認してみてください。
※ PATHの値が正しく設定されていてもこの状態になる場合は、Java SDKがPATHに設定した
C:¥Program Files¥Java¥jdk1.7.0_04¥bin
以外の場所にインストールされた可能性があります。C:¥Program Filesではなく、C:¥の下にあるかもし
れません。インストールされている場所が確認できたら、その場所をPATHに設定してください。
4
第1章 学習を始めるにあたって
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 5
1.2
Javaプログラムの作成と実行の方法
1
実行環境の設定をプログラムの作成とコンパイルを通して確認していきましょう。また実際にプログ
ラムを実行し、その結果を確認してみましょう。
前節で準備した環境を使用して、実際にJavaのプログラミングを行い、実行してみましょう。Javaによ
るプログラムの実行までの流れは以下のとおりであり、特別複雑なものではありません。
1
エディタを使用し、
ソースプログラムを作成
2
コンパイルを行い、
バイトコードを作成
エラーあり
3
エラーをチェックする
4
エラーなし
コマンドプロンプトで
バイトコードを実行
それでは実際にやってみましょう。
まず①の「エディタを使用し、ソースプログラムを作成」
です。Javaのプログラムだからといってこのエディ
タでないといけないというものは特にありません。みなさんが使い慣れたもので結構ですし、特になければ
Windows標準のメモ帳でも構いません。また現在ではフリーで提供される優れたエディタもたくさんあり
ます。これを機会に新しいエディタに挑戦してみるのもよいでしょう。メモ帳と比べると行番号を表示した
り、キーワードを反転表示するなどの機能が充実しています。
1.2
Javaプログラムの作成と実行の方法
5
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 6
では以下のプログラムを打ち込んでみてください。
◆ソース Rensyu101_01
public class Rensyu101_01{
1
public static void main( String[] args ){
System.out.println( "Javaの世界へようこそ!" );
}
}
各行の意味はここでは考えないことにしましょう。気を付けることは2つです。Javaのプログラムでは、大
文字と小文字が区別されますので上記のとおり入力してください。もうひとつは全角と半角(日本語の
ON/OFF)
にも気を付けてください。プログラムは原則として半角(日本語はOFF)
で入力します。上記の
例では「Javaの世界へようこそ!」だけを全角で入力します。前後にある「"」
も半角ですから注意してくだ
さい。
メモ帳を使った方はこんな感じでしょうか。
できあがったらファイルとして保存しましょう。その前にここで保存する場所と名前を説明します。まず、保
存する場所ですが、これからたくさんのプログラムを作っていきますので、学習専用の場所を作りましょう。
場所はディスク中のどこに作っても構わないのですが、その場所へ移動するときに楽なように「C:\java」
にしましょう。
6
第1章 学習を始めるにあたって
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 7
「マイコンピュータ」⇒「ローカルディスク
(C:)
」
を開き、右クリックの「新規作成」⇒「フォルダ」
で作成しまし
ょう。
1
またもうひとつの方法として、
「スタート」⇒「すべてのプログラム」⇒「アクセサリ」⇒「コマンドプロンプト」
で
「md c:\java」
とコマンドを打っても同様にできます。
1.2
Javaプログラムの作成と実行の方法
7
203374_ObjPgm_chap01_Qx3_121227 13.2.8 16:49 ページ 8
次に保存するファイル名ですが、実はJavaプログラムには名前の付け方に決まりがあります。詳細はこ
のあとで解説しますので、今回は「Rensyu101_01.java」
としてください。文字はすべて半角で、かつ大
文字小文字の区別もこのとおりにしてください。場所は先ほど作った「C:¥java」にします。メモ帳の場合
はこんな感じでしょうか。
1
ここを変更
ただしメモ帳の場合は気を付けなければいけないことがひとつだけあります。それはメモ帳というエディタは、
デフォルトの設定のままでファイル名だけを指定すると、ファイル名の最後に自動的に「.TXT」
を付けてし
まう場合があることです。これを防ぐためにファイル名を入力したら、
「ファイルの種類」
を
「すべてのファイ
ル」に変更してから保存をしてください。
できあがったらマイコンピュータからたどって[C:\java]フォルダの中身を確認してみましょう。
それからもうひとつ作業があります。今後はこのフォルダの中にファイル名が同じで、拡張子だけが異なる
ファイルがたくさん作成されることになります。もしあなたのパソコンがファイルの拡張子を表示しない設定
になっている場合は、あとで区別がつきにくくなるため、表示を行うように変更しておきましょう。変更する
手順は次のとおりです。
8
第1章 学習を始めるにあたって
203374_ObjPgm_chap01_Qx3_121227 13.2.8 16:49 ページ 9
先ほど作成した
「C:\Java」のフォルダを開き
「ツール」⇒「フォルダオプション」
を選択します。
「表示」のタブ
をクリックし、
「詳細設定」の中の「登録されている拡張子は表示しない」のチェックをはずし
[OK]をクリッ
クします。
1
ここをはずす
これでフォルダの表示が次のようになるはずです。
それではコンパイルに入りましょう。
まず「コマンドプロンプト」
を起動し、先ほどプログラムの保存を行った「C:\java」のディレクトリへ移動し
てください。JavaプログラムのコンパイルはJavac.exeというプログラムで行います。
「コマンドプロンプト」
で以下の行を入力して
[Enter]
キーを押します。
javac Rensyu101_01.java
1.2
Javaプログラムの作成と実行の方法
9
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 10
1
このようにとても殺風景ですが、何も表示されずにプロンプトが出れば成功です。
いよいよ次は実行します。実行は以下の行のように入力して
[Enter]
キーを押します
(以降、
[Enter]
キー
を押す操作説明は省略)
。
java Rensyu101_01
どうでしょうか、
「Ja
vaの世界へようこそ!」が表示されましたか? 簡単なプログラムですが、あなたが作っ
た記念すべき最初のJavaプログラムです。
以上で準備は終了です。このあとは今作成したJavaプログラムの動作のしくみを紹介します。
10
第1章 学習を始めるにあたって
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 11
1.3
Javaプログラムの動作原理
1
Javaによるプログラミングの勉強を始める準備は整いましたか。ではさっそくプログラミングに入りたいとこ
ろですが、その前にJavaのプログラムについてもう少し勉強しましょう。
Javaのプログラムにはいくつかの種類が存在します。アプリケーション、アプレット、サーブレットなどで
す。これらはそれぞれ用途によって使い分けられます。コンピュータ上で単独のプログラムとして動作する
アプリケーション。各コンピュータ上のブラウザの中で動作するアプレット。さらに別のマシン上で待機し、
要求を受け付け処理を実行し、結果をネットワーク経由で出力するサーブレット。本書ではこの中のアプ
リケーションを中心に解説します。
ところでそもそもなぜJavaはこれほど注目を浴びるようになったのでしょうか。いくつかの理由が考えられま
す。
• オブジェクト指向を無理なく実現できる
• 現在のインターネット社会に適している
• ハードウェアアーキテクチャに依存しない
• コンピュータ以外の家電製品でも動作する
など
列挙すればキリがありません。ここではこの中のひとつ、ハードウェアアーキテクチャに依存しないという
ことがらをとおして、Javaプログラムの動作のしくみを勉強しましょう。
コンピュータというものは、機械そのものであるハードウェアと、それを制御するOS
(オペレーティングシス
テム)
というプログラムの組み合わせで動作しています。現在のOSの代表はWindowsでしょう。ワープ
ロや表計算ソフト、DVDソフトの再生やゲームまで、すべてはOSの制御下で動作しているのです。みな
さんが作ったプログラムも同様にこのOSに制御されて動作します。
1.3
Javaプログラムの動作原理
11
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 12
ここに2台のパソコンがあります。この2台はメーカーが異なるので、アーキテクチャ
(パソコンの作り方や
動作のしくみ)
も異なります。それをこのように表しましょう。
1
A社のパソコン
B 社のパソコン
アーキテクチャの違いを図の上部
と
で表すことにします。
これら2つのパソコンにも前述のOSが必要です。またOSはそれぞれのパソコンのアーキテクチャに一致
していないとうまく動いてはくれません。
A社のOS
B社のOS
A社のパソコン
B 社のパソコン
そしてプログラムを動作させます。A社用、B社用それぞれこうなります。
プログラムX
プログラムX
A社のOS
B社のOS
A社のパソコン
B 社のパソコン
2つのプログラムはどちらも
「プログラムX」
、同じ機能のプログラムでありながら形が違う
(つまり作り直す
必要がある)
ことに注目してください。
その後Windowsが登場すると状況が変わります。2つのパソコンのイメージはこうです。
12
A社用の Windows
B 社用のWindows
A社のパソコン
B社のパソコン
第1章 学習を始めるにあたって
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 13
ここにやはりプログラムを載せてみます。
プログラム Y
プログラムY
A 社用の Windows
B社用のWindows
A 社のパソコン
B社のパソコン
1
今回もプログラムYの形に注目してください。2つのパソコンのOSは共通です。ただしOS自体は各社の
パソコンに合わせる必要がありますが、それはプログラマであるみなさんには関係ありません。一度
Windows用にプログラムを書けば、A社、B社どちらのパソコンでも動きます。
しかし世の中で稼動しているOSはWindowsだけではありません。何億円もするようなメインフレームと呼
ばれるスーパーコンピュータでは、UNIXというOSを採用しているものがほとんどです。このUNIXの仲間
はLinuxという名称であなたのパソコンでも動きます。またグラフィックデザインの世界ではアップル社の
MacOSが活躍しています。これらを図で表すと次のようになります。
プログラム Y
プログラムY
A 社用の Windows
B社用のWindows
A 社のパソコン
B社のパソコン
プログラムY
C社用のLinux
C社のパソコン
このように先ほどのプログラムYはC社のパソコンでは動作しません。しかしここに救世主が登場します。
それがJavaなのです。ただしJavaはプログラム言語でありOSではありません。実はJavaというプログ
ラムの実行環境に秘密があるのです。JavaというプログラムはVM
(バーチャルマシン)
と呼ばれる環境の
上で動作するのです。それではこのバーチャルマシンを説明しましょう。バーチャルマシンとは簡単にいえ
ば、OSとプログラムの間に位置し、各種のOSの差異を吸収するものです。以下の図を見てください。
Windows 用の VM
Windows 用のVM
A社用の Windows
B 社用のWindows
A社のパソコン
B 社のパソコン
UNIX用のVM
C 社用の UNIX
C 社のパソコン
やはりVM自体は各OSの上で稼動するものですから、面倒ですが各OS用に用意しなければなりません
1.3
Javaプログラムの動作原理
13
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 14
(しかしこれもあなたの作業ではありませんので、気にする必要はないでしょう)
。これによってあなたが作
るプログラムは唯一、VMの仕様である
に合わせて作ればよいのがわかりますよね。
これによってただひとつのプログラム
(プログラムZ)
が、次の図のように異なるパソコン、異なるOS上で
動作するということが実現されるのです。
1
プログラムZ
プログラムZ
プログラムZ
Windows 用のVM
Windows 用のVM
UNIX用のVM
A社用の Windows
B 社用のWindows
A社のパソコン
B 社のパソコン
C 社用のUNIX
C 社のパソコン
最後にVMの説明をもう少しお話ししておしまいにしましょう。
VMはJavaプログラムの実行環境です。プログラムというものは、人間が作成した時点ではソースプロ
グラムと呼ばれ、人間には理解できるのですがコンピュータには理解できません。したがってこのソースプ
ログラムをコンパイル
(翻訳と呼ばれます)
という作業を行いコンピュータが理解できる形に変換します。
この変換されたプログラムをオブジェクトプログラムまたはエグゼキュートプログラムと呼びます。Javaのソ
ースプログラムはコンパイルしてもオブジェクトプログラムにはならず、コンピュータが理解できる一歩手前
の形で止められるのです
(これをバイトコードと呼びます)
。このバイトコードはVMが理解できる形になって
いるため、どのOS用のVMでも共通の形になります。
あとは、VMがこのバイトコードを各コンピュータ、各OSが理解できる形に再変換することでプログラム
が実行されるのです。したがってプログラマはVM用に一度だけJavaのプログラムを作成すれば、ノート
パソコンからスーパーコンピュータまでさらにOSを気にすることなく実行できるのです。この原理をWrite
Once, Run Anywhere
(一度書けばどこででも動く)
と呼びます。
どうですかJavaの素晴らしさが、わかってもらえたでしょうか? では次にJavaのプログラムを理解する上
で必要不可欠なオブジェクト指向という考え方を勉強しましょう。
14
第1章 学習を始めるにあたって
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 15
第2章
オブジェクト指向とは何か
それではオブジェクト指向についての学習を開始しましょう。オブジェクト指向はコ
ンピュータ関連の項目としては比較的新しいものといえるでしょう。
しかしその進歩と発展には目を見張るものがあります。現在のコンピュータ界には
オブジェクト指向の基礎技術、応用技術などがあふれています。その中にはインタ
ーネットや携帯電話など、みなさんが無意識のまま既に利用しているものも数多く
存在しています。
オブジェクト指向を使用したプログラミングのスタイルは、従来のプログラムにはな
い特徴があります。本章ではその具体的な特徴を学習する前に、オブジェクト指
向というアプローチ
(考え方)
の全体像をお話ししたいと思います。まずは軽い気
持ちでスタートしてください。
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 16
2.1
オブジェクト指向出現の背景
オブジェクト指向を学習する前に、そもそもなぜオブジェクト指向なるものが脚光を浴びるようになってきたの
かを考えてみましょう。
話を単純にするために、コンピュータを使用した情報処理という世界に限定して考えてみることにします。
コンピュータシステムを使用した情報処理
(以降コンピュータシステムと表現する)
を分析してみると、その
大部分はコンピュータによる現実世界のモデリングであるといえます。つまり現実の世界に存在するさまざ
まな行為をコンピュータの中で同様に再現しようとしたものなのです。
たとえば給与計算システムは、実際に人手によって行われている事務処理の中のひとつの行為のモデリ
ングであり、経営支援システムは、各社の経営者層が頭を悩ませている会社の方向性や、業務のあり
方などをコンピュータを用いてさまざまにシミュレートし、最適解を導こうというものです。
2
しかし近年これらの要求に対して従来の既に確立された各種技法を用いてそれに答えることがむずかしく
なってきました。ではなぜむずかしくなったのでしょうか?
たとえば構造化分析などの十分に実績がある手法は、コンピュータ界を大いに発展させ、現在も根底か
ら支えています。しかしこの構造化分析手法が誕生した環境と現在のコンピュータ環境とでは計り知れな
い違いが出てきました。具体例をいくつか挙げます。
• コンピュータ自体の性能の向上
• 高性能コンピュータを複数組み合わせた分散処理に代表される処理形態の変化
• 定型的な処理のみならず非定型的な処理の増大
• 単純な処理の繰り返しから意思決定支援などへの複雑な処理の要求
これらのコンピュータを取り巻く環境の変化によって、現在のソフトウェア開発にさまざまな問題が発生し
てきました。いくつか例を挙げます。
• ソフトウェアへの高機能化要求による大規模化/複雑化
• 既存ソフトウェアの仕様変更要求に速やかに対応できない
• ユーザの要求を正確にシステムに反映できない
16
第2章 オブジェクト指向とは何か
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 17
これらの状況により、大規模化/複雑化は開発コストの増大を招き、仕様変更の増大はバックログとし
て増加の一途をたどるばかりになりました。特に上記3つ目の「ユーザの要求を正確にシステムに反映で
きない」
という問題は深刻であり、企業も冷静にコンピュータに対する投資対効果の検証を行い、業務
のコンピュータ化を疑問視する声も多くなってきたのです。
以上の例が示しているものは何でしょうか? これらの結果は前述のモデリングに失敗したことに起因す
るものが大きいのです。つまりユーザが本当に望むものをコンピュータ上で再現しきれなかった結果なの
です。言い換えれば、今後のソフトウェア業界はユーザの真のニーズを把握し、それをいかに正確にかつ
短時間でコンピュータ上に再現できるかにかかっているといえるでしょう。オブジェクト指向はこのモデリン
グ作業に適しているといわれています。
オブジェクト指向出現の要因は他にもあります。そもそもオブジェクト指向にはさまざまな種類が存在しま
す。たとえば以下のようなものです。
• OOA
(Object - Oriented Analysis) ___________ オブジェクト指向型分析
• OOD
(Object - Oriented Design)_____________ オブジェクト指向型設計
2
• OOP
(Object - Oriented Programming) ______ オブジェクト指向型製造
• OOT
(Object - Oriented Testing) ____________ オブジェクト指向型試験
このさまざまなオブジェクト指向は、ソフトウェア開発の標準的な順序に沿って、分析⇒設計⇒製造⇒試
験と出現してきたわけではありません。注目された順序からいえばOOPがもっとも早かったのです。本来
OOPは、その方面の研究者やその時代でいえば俗に言う一部の変わり者たちの間で人気を博していた
にすぎませんでした。それが次第に一般に知れわたるようになり、Windowsに代表されるGUIやイベン
トドリブン型のOSの普及も手伝い、急速に注目を浴びるようになりました。
そうすると次はOOPによって製造工程にだけオブジェクト指向技術を取り入れたソフトウェア開発工程で
は、どうしても一貫性を保った開発を行うことが困難になってきました。そこで製造以外の工程にもオブジ
ェクト指向を望む声が高くなり現在にいたっています。この部分については、本書の最後にモデリング結
果の実装として取り上げることにしましょう。
2.1 オブジェクト指向出現の背景
17
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 18
2.2
オブジェクト指向概要
オブジェクト指向が意味するものを考えてみましょう。平たくいえば「オブジェクト指向って何?」
、
「何がオブジ
ェクト指向なの?」
ということです。さまざまな定義
(解釈)
が存在するとは思いますが、ひとつの見解として本
書では以下のようにとらえていこうと思います。
そもそもオブジェクト指向という言葉は、
「オブジェクト=もの、指向=∼を目指した/∼に向いた」
というこ
とになります。では一体何がものを目指しているのでしょうか。このあたりから掘り下げていってみましょう。
結論からいえば既に、コンピュータシステムとは「現実の世界をコンピュータ内に再現(モデリング)
するこ
と」であると述べました。このモデリング作業が「ものを目指している」
といえるでしょう。
それは、データでも手続きでもなく、モノ即ちオブジェクトを中心に「分析/設計/製造/その他」
を行お
うという発想なのです。
2
ここで本文中の表現方法を提示しておきます。本書には今後もモノ、オブジェクトの記述が出てきますが、
漢字の物は通常の英単語としてのオブジェクト
(物体)
の意味として用い、カタカナのモノをオブジェクト指
向でいうところのオブジェクトとして表現します。
現実の世界を見渡してみると実にさまざまなモノが存在し、それらは互いに関係しあってある機能を実現し
ています。
たとえば会社の中を見てみましょう。会社の中には当然その会社の本業を行っている業務部門があります。
また会社には総務部に相当する本業以外の業務を行っているセクションも存在するでしょう。この2つの
部(当然、他にも複数の部は存在しますが)のどちらが欠けても会社としては機能しません。この2
つの部をそれぞれオブジェクトつまりモノとしてとらえればよいのです。
各部門はそれぞれ自分がやるべき仕事を独立して進めます。自分ができない仕事を行う必要が発生
したら、その仕事は他の部門に依頼し、その結果を利用してまた仕事を進めていきます。そして最終
的にひとつの会社として機能することになるのです。話をソフトウェアに戻せば、会社は製品としてのソ
フトウェア(アプリケーションプログラム)
であり、各部門がそのソフトウェアの中のある機能と見ること
ができます。
繰り返しになりますが、現実の世界にはさまざまなモノが存在しています。それらのモノたちは、それぞれ
独立して機能し、また互いに連携しながら別の機能を生み出しているのです。この単独のモノと2つ以上
のモノ同士の関係を、忠実にコンピュータシステム内に再現しようというのがオブジェクト指向型のアプロ
ーチなのです。
では具体的に従来のアプローチ法との違いを考えてみましょう。どのフェーズを例にして比較を行うかによ
ってさまざまなとらえ方があると思いますが、ここではあまり厳密にフェーズを意識しないで、総括的な話に
します。軽い気持ちで読んでください。
18
第2章 オブジェクト指向とは何か
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 19
手続き指向
これは名前が示すように、ある機能を考えた場合「どうやるか」
を中心にアプローチしていくものです。ひと
つの機能を、
「あるデータを入力して加工し、別のデータとして出力する」
という流れで考えていくものです。
最終的な目的を達成するために、このような処理を複数集めたものを定義するのです。前述の「入力⇒
加工⇒出力」のうち、加工の部分に焦点を当てたアプローチ法といえるでしょう。これを表す手段として
はフローチャートが一般的であり、実現手段としてはCなどのプログラミング言語で記述することになりま
す。
まず手順だ!
アレをして
次にコレをコッチに
そしてアレとコレを
ここで...
そのために必要な
データは
整数型を2つと
文字型をひとつ.
..
2
プログラマ
データ指向
これは手続き指向とは逆にシステムに必要なデータを中心にアプローチしていくものです。このアプローチ
法の場合、はじめにデータありきであり、
「あるデータはどのように変化していくのか」
または「会社にはどの
ようなデータがあり、それらはどのような仕事で使われているか」
などを定義することで、システムの全体像
をとらえようとするものです。表現手段としてはデータフローダイアグラムが一般的であり、実現手段として
は、リレーショナル型データベース+COBOL言語などが一般的です。
プ
ロ
グ
ラ
ム
B
プログラムA
会社全体の
プログラムC
データ
プ
ロ
グ
ラ
ム
D
2.2 オブジェクト指向概要
19
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 20
オブジェクト指向
さて最後はオブジェクト指向ですが、簡単にいってしまえば先ほどの手続きとデータのどちらも重要視した
アプローチ法なのです。つじつま合わせのようでいい加減な解説だと思われるかもしれませんが、事実こ
の表現がオブジェクト指向をもっともよく表しています。オブジェクト指向はモデリングを行う際に、その対
象となるシステムをモノの集まりとして定義します。それら個々のモノは、それぞれがある機能を持っていま
す。機能はある処理(多少ニュアンスが異なりますが「処理≒手続き」
と考えてもよいでしょう)
を実施した
結果であり、その処理を実行するためにひとつ以上のデータを必要とします。この「手続き」
と
「データ」
を
セットにしてひとつの「オブジェクト」
と見なしていくのです。
さらにそれらのオブジェクト同士の関連を突き詰めていき、ひとつのシステムを構築していきます。改めて
考えてみると、これはまさに私たちの生活スタイルそのものであり、極めて自然なアプローチ法であること
がわかっていただけるはずです。みなさんも決してひとりで生きているわけではないでしょう。さまざまな道具
を使ったり、いろいろな人々に助けられながら生活していますよね。
以上のようにオブジェクト指向のアプローチは、突如湧いて出た特別な考え方ではなく、私たちが日常の
2
生活で何気なく行っている思考や行為に極めて近いものなのです。したがって、そもそもプログラム開発
を、手続き型やデータ主導型という、どちらかに偏った考え方で行おうという従来のコンピュータ中心の
開発手法では、現在のニーズに対応しにくくなってきたといえるでしょう。
オブジェクト指向は
プログラムとデータのどちらも重要
重要
プ
ロ
グ
ラ
ム
重要
手続き指向
オ
ブ
ジ
ェ
ク
ト
データ指向
デ
ー
タ
以上でオブジェクト指向というものを、おおまかにとらえていただけたでしょうか。次は個々の要素を見て
いくことにしましょう。
20
第2章 オブジェクト指向とは何か
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 21
2.3
オブジェクト指向の特徴とメリット
オブジェクト指向を解説するときに登場する用語の整理をしましょう。聞きなれない言葉も出てきます
が、簡単にお話ししますので頑張って進めてください。
それでは次にオブジェクト指向を構成しているトピックを順番に説明していきます。しかし最初に断っておき
たいことがらがひとつあります。それはオブジェクト指向を学習しようとすると、どうしてもさまざまな用語に
出くわすことになります。まじめな読者の方は、まずこの用語を理解しようと懸命になってしまいがちです。
しかしこれは私が伝えたいことではありません。また多くの場合、最終的には挫折にたどり着くことが多い
でしょう。したがって本書では、可能であれば最初から最後まで、オブジェクト指向用語を使用せずに説
明したいところです。しかしながら一切の特別な名称を使わずに、オブジェクト指向を説明することは困難
であるため、必要最低限の用語解説を行いたいと思います。
2
本書を読んでいただいている方々に理解していただきたいのは、オブジェクト指向が持つ思想や目的/目
標であり、用語集の丸暗記で終わってしまわないことを願いたいと思います。
そもそも真のオブジェクト指向体質に変身できれば、用語などはあとから自然に身につくものであり何も心
配はいりません。
オブジェクト
オブジェクト指向を学習する上で、オブジェクトを抜きにしては話が先に進みません。オブジェクトは今まで
の説明の中で、唯一出てきた用語であり、おおまかな感覚は既につかんでいただけたことでしょう。改め
て定義すれば次のようになるでしょうか。
オブジェクトとはシステムを構成する要素であり、各オブジェクトは、ひとつ以上の機能を持つ
オブジェクト
No.1
オブジェクト
No.2
オブジェクト
No.3
システムX
これですべて言い尽くせればよいのですが、多少補足が必要でしょう。
それは、
「あるオブジェクトは誰が見てもオブジェクトか?」
という問題であり、これは重要な問題です。その
答えはノーです。つまりオブジェクトの定義はシステムをどの視点からとらえるかによってさまざまに変化す
るものなのです。ある立場の人から見れば必要不可欠なオブジェクトも、別の立場の人から見ればその
存在価値すらないこともあり得ます。
2.3 オブジェクト指向の特徴とメリット
21
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 22
たとえば、ある図書館のシステムを考えてみましょう。図書館で働く人と図書を借りる人とではオブジェクト
のとらえ方が異なってきます。この点は重要なことであり特に分析設計の段階ではその結果に差が生じ
てくることを覚えておいてください。
僕には関係
ないや!...
利用者
図書の新規追加作業
この作業に関する
オブジェクトは?...
図書館職員
2
また、みなさんが勉強していくJavaの世界では、オブジェクトは、実際にはこのあと説明するインスタン
スというものを指すことになります。
クラスとインスタンス
次にクラスを紹介します。クラスとは、
「個々のオブジェクトに共通な性質をまとめたもの」
といえます。つま
り各オブジェクトの基(お手本、これをテンプレートという)
になるものです。クッキーを作る際の「型」のよ
うなものだと思ってください。したがってこの型さえあれば、あとは同じ型のクッキー
(オブジェクト)
が作れる
というわけです。Javaによるプログラミング作業も、このクラスをもとに行っていくのです。
もう少し話を進めましょう。実はこのクラスとしてまとめる性質の摘出要素は、オブジェクトに限らず、いく
つかのクラスに共通の性質をまとめてさらに上位のクラスとすることも可能なのです。つまりクラス⇒オブジ
ェクトと同様にクラス⇒クラスという階層構造も存在します。このときの上位のクラスを、スーパークラス
(または基底クラス)
、下位のクラスをサブクラス
(または導出クラス)
と呼びます。
ではオブジェクト⇒オブジェクトという階層構造も存在するのでしょうか? 答えはノーです。なぜならば前
述のとおりオブジェクトはシステムを構成する各要素であると定義しました。オブジェクトは、実際に表面
上に現れた実体であり、クラスはそれらを抽象化した概念ということになります。したがって概念の上の概
念は存在しても、実体の下の実体はあり得ないからです。
このことからもオブジェクトはクラスを基に生成された実体であると表現することができ、この実体
(=オブ
ジェクト)
のことをインスタンスと呼びます。
22
第2章 オブジェクト指向とは何か
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 23
クラス 1
A
抽
象
化
サブクラス
実体化
具
体
化
クラス 2
A+B
スーパークラス
実体化
実体化
オブジェクト
1
オブジェクト
2
オブジェクト
3
インスタンス
インスタンス
インスタンス
ところでみなさんの中には、そろそろ不安に感じている方もいらっしゃるでしょう。先ほどからまったくJava
2
が出てきません。プログラムの勉強を始めたはずなのに、オブジェクト指向に引きずり込まれて...という
感じでしょうか? もう少し我慢して付き合ってください。今この考え方をしっかり学習しておくことが、Java
をものにするコツなのです。そして実はこの階層構造
(親子関係)
を利用することが、Javaの典型的なプ
ログラミングスタイルなのです。先ほどみなさんがインストールしたJavaの開発環境の中には、既にこの
クラスがたくさん詰め込まれているのです。あとはこのたくさんのクラスの中から、みなさんが作りたいプロ
グラムの機能に似ているものを選んで、利用するだけです。ですからこの部分はしっかり勉強しておいてく
ださい。ではもう少し解説を続けましょう。
さて、今お話ししたこの階層構造(クラス⇒クラスでも、クラス⇒インスタンスでも可)
には、ある決まりが
存在します。それは階層構造の下位に位置するもの
(これを子と表現する)
は、上位に位置するもの
(これ
を親と表現する)
の性質をすべて引き継ぐという決まりです。
「一部分だけ引き継ぐというような、都合のよ
い使い方はできませんよ!」
ということです。融通が利かなくて使いにくそうに感じますが、たいした問題で
はありません。すべて引き継いでも、必要のないものは使わなければよいだけですから。では結論です。
それぞれの「子」
は、自分が必要とする機能を持った「親」
を基に生成し、
「親」
との違い
(付加機能)
だけ
を独自に定義していきます。
この親と子の違いを差分といい、このようなプログラミングスタイルを差分プログラミングと呼びます。
継承
ではこの親と子の関係をもう少し詳しく見ていきましょう。ここでは継承という言葉を説明します。継承と
は、親の機能を引き継いで子を生成し、さらに子には独自の機能を追加することができるしくみと表現
することができます。何かに置き換えて見てみましょう。身近な例として電話にしてみます。
電話にはみなさんの家に設置されている固定電話と持ち運び可能な携帯電話があります。固定電話も
携帯電話も「通話する」
ということに関しては同様です。この例では固定電話と携帯電話に共通する性
質(機能等)
を電話として定義しています。見方を変えれば、
『まず電話を定義し、その電話の機能にそれ
ぞれ独自の機能を追加して、固定電話と携帯電話を定義した』
という表現になります。
2.3 オブジェクト指向の特徴とメリット
23
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 24
具体的には電話には、
「相手を指定し通話ができる」等のすべての電話が共通して持っている性質が定
義してあるとします。この電話を継承して定義された、固定電話も携帯電話もこの性質を暗黙のうちに引
き継ぐことになります。そして固定電話は固定電話が持つ独自の機能、
「子機を追加して内線通話ができ
る」等を追加定義し、携帯電話は「メールができる」等の携帯電話独自の機能だけを定義すればよいこと
になります。このことは新規に定義しなければいけない量を減少させるとともに、親と子の違い差分にの
み注目することにより、各オブジェクトの特徴を明確にしやすくするというメリットを生むことになるのです。
ここで用語を整理しておきましょう。前述のように親クラスの機能を引き継いで子クラスを定義することを
継承といいます。また別の表現として親をベースにして、子を定義することを特化といい、逆に子から性
質を抜き出し親として定義することを汎化といいます。この特化と汎化の概念はJavaではextendsとい
う機能によって実現されています。
差分
電話
2
固定
電話
携帯
電話
さて、そろそろ疑問に感じ始めている方もいるのではないでしょうか。今までの例では、親から子への継承
は
〈親:子〉
が〈1:1〉
もしくは
〈1:多〉のパターンばかりでした。では、この逆はあり得ないのでしょうか。す
なわち現実の親子関係
(父親と母親の両方の性質を受け継いで、子供がひとり以上存在するという状態)
のように
〈親:子〉
が〈多:1〉
もしくは
〈多:多〉のパターンです。このようなパターンはあり得ます。話が複雑
になるのを防ぐため、詳細は割愛しますが、複数の親を継承し子を生成するパターンを多重継承と呼び、
一例をあげれば社会人と学生の両方の性質を持った勤労学生等がこれに相当します。
(ただしこれから勉強するJava言語では純粋な多重継承は禁止されており、他の方法でこれに近い機能
を実現しています)
多重継承とは、複数の
“親”の機能を引き継いで
“子”
を生成すること。
社会人
(社員番号)
学生
(学籍番号)
勤労学生
(社員番号)
(学籍番号)
24
第2章 オブジェクト指向とは何か
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 25
集約
次は集約です。集約とはあるオブジェクトの構成要素の一部分に他のオブジェクトを含む関係を表す概念
です。
別な表現を用いれば、あるオブジェクトをそれを構成している要素
(パーツ)
に分解して
(逆に見ればパーツ
を集めて)
関連を表すものです。身近な例では、みなさんの学校はどうでしょうか、学校という存在は建物、
教室といった物理的な建造物、講師や学生という人的なもの等さまざまなオブジェクトの集合体で構成
されています。またその教室は机や椅子、黒板といったパーツにさらに分解されます。これらを図で表すと
次のような感じです。
教 室
机
2
椅 子
講 師
黒 板
学 校
学 生
またこの集約は、関連性の強弱によって2種類に分類されています。この2種類のうち関連の弱い方を単
に集約やアグリゲーションと呼び、強い方を合成集約やコンポジションと呼びます。この2種類の厳密な
使い分けはありませんが、一般的に2つのオブジェクトの集約を表現する場合に、ライフサイクル
(生成と
消滅)
が一致する場合にはコンポジションが使われます。言い換えれば片方のオブジェクトがなくなるとも
う一方のオブジェクトも存在しなくなるようなものです。たとえば動物園を考えた場合に動物はその構成
要素になるでしょう。もちろん他にも職員や檻等たくさんの要素が考えられます。このうちの動物が消滅
した場合、そこはもう動物園とは呼べなくなります。このようにあるオブジェクトの構成要素のうち、必要
不可欠であるものに対してコンポジションを使用します。
このように関連の考え方には2種類存在しますが、Javaのコーディング上はこの2つの違いは特になく、
どちらもJavaの属性
(フィールド)
として実現されます。
2.3 オブジェクト指向の特徴とメリット
25
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 26
多態性(ポリモルフィズム)
多少話がむずかしくなってきましたが、オブジェクト指向の概念を学習する上で重要な項目がもう少しあり
ますので頑張ってください。
次は多態性という聞きなれないものです。表現がむずかしいのですがひと言で表せば、多態性とは、同
じ形式の指示で異なる振る舞い
(処理)
を発生させるしくみといえます。もう少し補足しましょう。
これまでオブジェクト指向の中心は文字どおりオブジェクトであると説明してきました。そしてこのオブジェ
クトが定義できれば、あとはこのオブジェクトに処理を依頼しながら仕事を進めていくことになります。この
処理の依頼は具体的にはオブジェクトのメソッドを起動することにあたります。
身近なたとえに置き換えると、父親が子供に向かって「勉強しなさい」
とメッセージを発します。それを聞い
た姉は方程式を解き始めます。一方弟は九九の練習を始めました。実際に行っていること
(すなわち処
理)
は異なりますが、起動は同一の形式(勉強しなさい)
になります。別な例では家庭用のゲーム機です。
ゲームソフトを入れればもちろんゲームができますが、DVDプレーヤーとして映画を観ることもできます。こ
2
れも実際の機能やその機能を実現するための処理は異なりますが、動かし方は同一の形式(ディスクを
入れる)
です。このように多態性という状況は日常生活の中では頻繁に接する状態であり、決して特別な
ものではありません。
ただそれがプログラムとどのような関連があるかについては、もう少し待ってください。この多態性の概念
はJavaではオーバーロードやオーバーライドという機能によって実現されています。
さあ!
方程式
勉強しなさい!
メッセージ
あ∼あ!
九九か
勉強しなさい!
メッセージ
26
第2章 オブジェクト指向とは何か
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 27
カプセル化
今までのところでオブジェクトは、ある機能を有するひとかたまりのモノであると紹介しました。ここでお話
しするカプセル化とは、このオブジェクトの構造を表しています。ひとつのオブジェクトは、その機能を実現
するためにオブジェクトの内部に、データと手続きを持っています。カプセル化はこのデータと手続きをひ
とつの単位として定義するアプローチといえます。改めて定義すれば、
「カプセル化とは、ある機能を実現
するためのデータと手続きをひとつの単位にまとめた構造」
といえます。またそのメリットは、オブジェクトが
「状態」
と
「振る舞い」
を外部に対して包み隠すことにより、他のオブジェクトに対して独立性を高めること
にあります。確かに、ある機能を実現するための手続きと、そこで使用されるデータがひとつにまとまって
いればわかりやすそうですよね。ところがカプセル化を行わないプログラム言語では、一般的にこの方法
はよくないやり方の部類に入るのです。
「データはひとつの場所にまとめなさい」
、
「処理は理路整然と並べ
なさい」
という具合です。どちらの方法にも理由があり、どちらが正しいというものではありません。それぞ
れのスタイルの違いだと思ってください。また、Javaの世界ではこの手続きのことをメソッドと呼びます。
ここで今までの話を整理しておきましょう。今紹介したカプセル化は構造、概念の名称です。実際にカプ
2
セル化されて定義されるのは、既に紹介したオブジェクトになります。またこのオブジェクトは、クラスもし
くはインスタンスということでした。このあたりが多少ややこしいですね。でも最初にお話ししたように、今
はそれほど用語にはこだわらなくて構いません。みなさんに理解してもらいたいのは、
「オブジェクト指向」
の考え方です。
日常生活の中にもカプセルがあります。そう、みなさんご存知の薬のカプセルです。あれも同様に、中
に入っているひとつひとつの成分(すなわち機能)
を意識することなく、熱を下げたければあるカプセル、
お腹が痛かったら別のカプセルといった具合に利用しています。
では最後に、このカプセル化を実施することのメリットを図で紹介しましょう。カプセル化されたオブジェク
トは、外部からはブラックボックスとして見えます。ブラックボックスとは、文字どおり中身の見えない箱を
意味します。中が見えないので外からは、ある機能をどのようにして実現しているのかはわかりません。しか
しそれでよいのです。このことはデメリットではなく、むしろ中身を意識しなくてよいというメリットとして扱わ
れます。
カプセル化された
オブジェクトは
データ
外部からは単に結果を返すひとつの
データと同じに見えます。
メソッド
2.3 オブジェクト指向の特徴とメリット
27
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 28
つまりみなさんは、自分が実現したいことがらの役に立ちそうなオブジェクトを見つけたら、その中で何が
どのように行われているかなどは一切気にせず、単純にそれを部品として使えばよいのです。これこそまさ
にオブジェクト指向型のプログラミングスタイルの真髄です。
ちょっと箇条書きにしてみましょう。
•「自分がやりたいことを考える」
•「役に立ちそうな部品を集める」
•「部品を組み合わせて仕事をさせる」
•「どうしても足りないところだけプログラミングする」
•「楽をして最小限の努力で完成!」
ね!どうですか、オブジェクト指向って結構イイでしょう。
さらにこのカプセル化されたオブジェクトは、メッセージと呼ばれるしくみを用いてオブジェクト同士でやり
2
取りをすることができます。したがってあるオブジェクトがもたらした結果
(ひとつでも複数でも可)
は、さらに
別なオブジェクトのデータとして、新たな存在価値が生まれてくるのです。
機能 a
機能b
データ
メソッド
機能 d
機能 e
機能c
メッセージ
今ここに、それぞれある機能を持ったオブジェクト、a∼eがあるとします。各機能は単独である仕事を行
います。次に「機能a」
、
「機能b」
、
「機能c」
は「メッセージ」
を用いて、オブジェクト同士でやり取りを行い、
新たな結果、
「機能X」
を生み出します。同様に機能d、機能eから「機能Y」が生み出されたとします。
これらの動きは、外部からは単に機能Xと機能Yとして映るだけで、水面下で行われていた、オブジェクト
同士のやり取りは見えません。つまり完全にブラックボックス化され、そのブラックボックスから生まれた結
果だけが現れます。
28
第2章 オブジェクト指向とは何か
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 29
機能 a
機能 b
機能X
この 3つの機能の連携は
単一の機能のように振る舞う
機能 c
機能 d
機能 e
機能Y
2
この2つも単一の機能のように振る舞う。
さらに機能Xと機能Yも連携して機能すると単一の機能Zとして見える。
機能 X
機能Z
機能 Y
このように各オブジェクトは、ときには単独で、またあるときはお互いに連携をとり、最終的な目的を果た
すように機能していくのです。いかがでしょうか? カプセル化の意味とそのメリットが理解していただけた
でしょうか。
部品化
最後に部品化のお話をして第2章を終わりにしましょう。部品化とは、今まで説明してきたオブジェクト指
向の考え方を総集した、プログラムの開発スタイルのことです。私は先ほど、
「みなさんがインストールし
たJavaの開発環境の中には、クラスがたくさん詰め込まれているのです」
と紹介しました。実はこのたくさ
んのクラス群こそが、部品の集まりなのです。Javaによるプログラミングは、この部品を組み合わせて実
現されます。したがって、ちょっと乱暴な言い方をすれば、新たにプログラムを作るといっても、実はそのほ
とんどが既にできあがっていて、みなさんはそれらを上手に組み合わせるだけなのです。どうですか? 楽
そうだ! と思った方も、つまらない! と思った方もいるでしょう。そのどちらもハズレです。楽そう? い
えいえ、プログラムはそれほど甘いものではありません。やることがなさそうでつまらない? いえいえ、あ
2.3 オブジェクト指向の特徴とメリット
29
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 30
なたの腕前を発揮する場面は山ほどあります。ところでなぜ部品化を行うのでしょうか? 部品化のメリッ
トはたくさんありますが、主なものは以下のとおりです。
• プログラムの品質の向上
• プログラムの生産性の向上
つまり、よいものが早く安くできるということですね。これはプログラムの究極の理想です。そんなに都合
よくいくものでしょうか? ちょっと疑わしいところはありますが、もう少し見ていきましょう。
ひと昔前、プログラムは悪い意味で芸術品でした。よい意味の芸術品は、みなさんが想像する一般的
な芸術品です。才能のある人が生み出す絵画や陶芸などです。それらは大変高価ではありますが、見る
人を楽しませ文化になります。悪い意味の芸術品は、作成期間が長く大変高価な割にはたいした価値
のないものです。もちろんプログラマは日々一生懸命にプログラムを作っています。悪い人ばかりがプロ
グラマをやっているわけではありません。しかしプログラムは、ひとつひとつ注文を受けてから人間が手作
りで作成するものですから、どうしても完成までに時間がかかり、品質にもばらつきが出ます。つまり高品
質のプログラムを短期間で供給するということが、コンピュータ業界の夢だったのです。
2
自動車を作ることを考えてください。現在の生産ラインでは、あの高品質のものを分単位で生産していき
ます。値段は多少高いですが、買う人が満足できる値段です。なぜ高品質のものを短期間で供給できる
のでしょう? なぜプログラムではそれができないのでしょう? 自動車とプログラムじゃ、全然違うじゃな
い。そんなことはありません、どちらも工業製品です。その答えが部品化です。
いま、自動車メーカーが新機種を開発しているとします。思い切ってエンジンから新設計するかもしれませ
んが、いくら新機種だといっても、ネジ一本から新規に設計することはないでしょう。もう少し大きな部品
でも構いません。ハンドルは既にあるものと同じかもしれません。タイヤは? このように自動車は、既に
存在し十分な実績のある部品を組み合わせて新機種を開発しているのです。
プログラムもこれを見習いましょう。Javaには十分に要求にこたえられる部品が、Javaの開発元である、
米Oracle社から供給されています。これらの部品は完成品ですから、これを組み合わせることで生産性
が上がります。さらにこれらの部品は十分なテストを経て品質が安定しています。この高品質の部品を使
用することでプログラム自体の品質も向上します。そして部品の組み合わせは、また新たな部品となり次
のプログラム作りに生かされていくのです。
いかがでしょうか、この部品化がプログラミングの方法を大きく変え、コンピュータ業界の救世主になるか
もしれない重要なキーワードだということがわかっていただけたでしょうか。いつの日か私のプログラムの中
に、みなさんの作った部品が使われる日が来るかもしれません。
以上で、オブジェクト指向を構成する各要素の説明を、ひとまず終わることにしましょう。次の第3章では
Javaの文法をとおしてプログラムのしくみを勉強していきましょう。
30
第2章 オブジェクト指向とは何か
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 31
確認問題 01
Q1 オブジェクト指向出現の背景について、以下の説明文の空欄を埋めなさい。
コンピュータシステムを分析すると、その大部分はコンピュータによる
[
[
のである。オブジェクト指向は、この
[
は、
[
a
]
の
[
b
]
である。
]
とは、現実の世界に存在するさまざまな行為をコンピュータの中で同様に再現しようとしたも
b
c
]作業に適しているといわれている。オブジェクト指向に
b
(
]分析工程)
、OOD
(
[
d
]
)
、OOP
(製造工程)
、
[
e
(
]試験工程)
な
どのさまざまな種類が存在し、Javaなどのオブジェクト指向プログラミング言語は、
[
f
]
で用い
られる。現在では、分析・設計からテストにいたるすべての工程において、オブジェクト指向による一貫し
た開発を行うために、さまざまな手法が標準化・実用化されている。
Q2 「オブジェクト指向」
とは何か、簡潔に答えなさい。
Q3 システム開発における各種指向と対応する説明文を線で結びなさい。
手続き指向
•
• システムに必要なデータを中心にしたアプローチ法
データ指向
•
•
手続き指向とデータ指向を合わせたアプローチ法
オブジェクト指向
•
•
機能の手順を中心にしたアプローチ法
2
Q4 以下の文章を
「手続き指向」
「データ指向」
「オブジェクト指向」の観点から分類し、手続き指向には「手」
、
データ指向には「デ」、オブジェクト指向には「オ」
を
[
]
に記入しなさい。
a. 「手続き」
と
「データ」
をセットにする
[
]
b. 表現手段としてDFDが使用される
[
]
c. 表現手段としてフローチャートが使用される
[
]
d. 実現手段としてC言語により記述される
[
]
Q5 次の説明に該当する語句を答えなさい。
a. クラスを基に生成した実体
[
]
b. あるクラスから見た上位のクラス
[
]
[
]
付加機能だけを独自に定義していくプログラミングスタイル
[
]
e. システムを構成する要素であり、ひとつ以上の機能を持つもの
[
]
c. 個々のオブジェクトに共通な性質をまとめたもの、
クッキーを作る際の「型」のようなもの
d. 「子」
は「親」
を基に生成し、
2.3 オブジェクト指向の特徴とメリット
31
203374_ObjPgm_chap01_Qx3_121227 2/8/13 4:49 PM ページ 32
Q6 継承の表現として正しいものを選びなさい。
ア
イ
自転車
ハンドル
サドル
自動車
ペダル
ウ
乗用車
トラック
エ
人間
犬
2
バス
猫
りんご
イルカ
みかん
すいか
バナナ
Q7 オブジェクト指向でシステムを開発する場合、カプセル化の効果として適切なものはどれか。
ア. オブジェクトの内部データ構造やメソッドの実装を変更しても、
その影響を他のオブジェクトに及ぼしにくい。
イ. 親クラスの属性を子クラスが利用できるので、
親クラスの属性を子クラスの属性の定義に利用できる。
ウ. 既存の型に加えてユーザ定義型を追加できるので、
問題領域に合わせてプログラムの使用を拡張できる。
エ. 同一メッセージを送っても、受け手のオブジェクトによって、それぞれが異なる動作をするので、
メッセージを受け取るオブジェクトの種類が増えても、メッセージを送るオブジェクトには影響がない。
Q8 プログラムの「部品化」のメリットを2つ挙げなさい。
Q9 部品化によってQ8のようなメリットが得られる理由を記述しなさい。
32
第2章 オブジェクト指向とは何か
Fly UP