Java(Object指向)

Javaとは

オブジェクト指向の言語です。OOPについては下記の項目を参照してください。
サン・マイクロシステムズが開発したプログラミング言語です。C++の仕様とよく似ていて、この言語の無駄と分かりにくさを改良したものといえます。Windows用にC++などで作成されたプログラムはMac OS上では動きませんが、Javaで作成したものはどのOS*1上でも動くのが最大の特徴です。作成されたプログラムはコンパイルしてJavaバイトコードという中間コードに変換します。実行時にはパソコンにインストールされたJavaVM*2という変換ソフトが直接読み込んで処理するインタープリタの言語です。Javaを使って作成するプログラムにJavaアプレットがあります。これはHTML文書に組み込んで利用するプログラムで、ブラウザ上で動作するのが特徴です。Webページのアニメーションなどを表現できます。同様にJavaで作成されたアプリケーションをJavaアプリケーションといい、JavaVM上で動作しブラウザとは別に動作するソフトウェアとなります。また、Javaアプレットがブラウザで実行されるのに対して、JavaサーブレットといってWebサーバで必要に応じて実行されるプログラムもあります。
*1:Windows ,Mac OS, Linux, Sun OS etc

*2:Virtual Machine

Object指向とは

オブジェクト指向はソフトウェア開発の総合技術。

オブジェクト指向でなぜソフトウェアを作るのか。

その理由はソフトウェアを楽に作りたいからである。

オブジェクト指向を一言でいえば

難しいソフトウェア開発を楽に行うための総合的な技術。

オブジェクト指向技術が難しいと思われるのは、技術そのものの複雑さに起因するものではなく、状況が混乱しているからと言った方が適切。
不適切な比喩や比喩の使いすぎは混乱を与えてしまう危険。

オブジェクト指向(Object Oriented)は「もの中心」あるいは「もの指向」という意味。

オブジェクト指向の場合は、プログラム言語やUML、大規模な再利用部品など、すぐに使える技術がベースにある。

OOPの仕組みとして特徴的なメモリの使われ方を説明。

OOPがもたらした、再利用部品群とデザインパターン。

OOPの仕組み、上流工程、汎用整理術。

UML,モデリング技術。

プログラミングを正しく理解する、オブジェクト指向の仕組みと現実世界を混同しないことがコツである。

オブジェクト指向プログラミングの三大要素―クラス、ポリモーフィズム、継承。

  • クラス―「分類」
  • インスタンス―「具体的なもの」、「実例」
  • クラス―インスタンス、集合と要素の関係。
  • ポリモーフィズム―「いろいろな形に変わる」、「多態性」、「類似したクラスに対するメッセージの送り方を共通にする仕組み」、「相手が具体的にどのクラスのインスタンスであるかを意識せずにメッセージを送れる仕組み」、「メッセージを送る側が楽をするための仕組み」。
  • 継承―「ものの種類の共通点と相違点を体系的に整理する仕組み」、全体集合と部分集合
  • スーパークラスに共通の性質をきちんと定義しておくと、サブクラスを楽に作成できる。

<オブジェクト指向と現実の違い(その1)>

  • 現実世界では先に具体的なものがあり、それを様々な基準で分類する。
  • オブジェクト指向の世界では1種類のクラスからインスタンスが作られる。作られたインスタンスは複数のクラスに帰属することができず、時間がたっても別のクラスに所属替えすることができない。

<オブジェクト指向と現実の違い(その2)>

  • 現実世界で動く人間は、個人個人が意志を持って自由に動く。
  • オブジェクト指向の世界のインスタンスは、外部から指示がない限り自分から動くことはなく、あらかじめ決められたことをその通りにしか実行できない。

オブジェクト指向技術の中心はプログラム技術であり、クラス、ポリモーフィズム、継承も、純粋にプログラミング言語の仕組みとして理解が必要。
OOPはそれ以前のプログラミング技術を基礎として、その欠点を補うために考えられたものである。

オブジェクト指向は品質のよいプログラムを高い生産性で作るための実践的な技術である。

C言語は構造化プログラミングの機能を完全にサポートしている。メモリ領域を効率的に使用するためのポインタなどのきめ細かな機能を備えていた。書式付で文字列を出力する処理はprintf関数で実現している。
COBOLやFORTRANでは言語仕様として対応している。この仕組みにより、言語コンパイラを改良しなくても、言語使用レベルの機能追加ができるようになった。これは、現在のJavaなどのオブジェクト指向環境でも引き継がれている重要な考え方である。
構造化プログラミングでは解決できなかった2つの問題、グローバル変数問題と貧弱な再利用。OOPで解決。

  1. OOPにはグローバル変数を使わずに済ませる仕組みが備わっている
  2. OOPには共通サブルーチン以外の再利用を可能にする仕組みが備わっている

クラスは、関連性の強いサブルーチン(関数)とグローバル変数を1つにまとめて粒度の大きいソフトウェア部品を作る仕組みである。
ポリモーフィズムと継承は、共通サブルーチンではうまく対処できない重複したコードを一本化する仕組みである。

クラスは「まとめて、隠して、たくさん作る」仕組み、

  1. サブルーチンと変数を「まとめる」
  2. クラスの内部だけを使う変数やサブルーチンを「隠す」
  3. 1つのクラスからインスタンスを「たくさん作る」
  • OOPではクラスにまとめられたサブルーチンを「メソッド」、グローバル変数を「インスタンス変数」(別名は属性、フィールド)と呼ぶ。
  • 大規模なソフトウェアをさらに整理整頓するために複数のクラスをグループ化する「パッケージ」という。

<クラスの効能1:まとめる>

  • 結びつきの強い(複数の)サブルーチンと(複数の)グローバル変数を1つのクラスに「まとめる」ことができる。
  • 部品の数が減る
  • メソッド(サブルーチン)の名前付けが楽になる
  • メソッド(サブルーチン)が探しやすくなる

<クラスの効能2:隠す>

  • クラスに定義した変数とメソッド(サブルーチン)を、他のクラスから「隠す」ことができる。
  • これにより、プログラムの保守性悪化の元凶となるグローバル変数を使わずにプログラムを書くことが可能になる。
  • インスタンスはクラスで定義したインスタンス変数が確保されるメモリ領域である。
  • インスタンスを格納する変数名.メソッド名(引数)
  • 定義したクラスの側では、そのインスタンスが複数同時に動くことを全く意識する必要がない。
  • アプリケーションでは同種の情報を複数同時に扱うケースがある。
  • ファイル、文字列、GUIのボタンやテキストボックス、ビジネスアプリケーションの顧客や注文や社員、通信制御プログラムの電文やセッションなど

<クラスの効能3:たくさん作る>

  • いったんクラスとして定義すると、実行時にそこからいくつでもインスタンスを作ることができる。
  • これにより、ファイル、文字列、顧客情報など、同種の情報を複数同時に扱う処理であっても、そのクラス内部のロジックをシンプルにできる。

<OOPの三大要素1-クラス>

クラスは「まとめて、隠して、たくさん作る」仕組み

  1. サブルーチンと変数を「まとめる」
  2. クラスの内部だけで使う変数やサブルーチンを「隠す」
  3. 1つのクラスからインスタンスを「たくさん作る」

<インスタンス変数の性質>

  1. 別のクラスのメソッドからアクセスできないように隠すことができる。
  2. いったんインスタンスが作られた後は、必要なくなるまでメモリ上に残される。

インスタンス変数は「長持ちするローカル変数」または「仲間内だけのグローバル変数」である。

<OOPの三大要素2-ポリモーフィズム>

ポリモーフィズムはサブルーチンを呼び出す側のロジックを一本化する仕組み、すなわち「共通メインルーチン」を作る仕組みである。

<OOPの三大要素3-継承>

変数とメソッドをまとめた共通クラスを作って、その定義を丸ごと拝借できる仕組み。

継承は、クラス定義の共通部分を別クラスにまとめることで、コードの重複を排除する仕組みである。

OOPの継承ではスーパークラスの性質はサブクラスに引き継がれた後もスーパークラスに残る。

なぜ変数に対して型を指定するのか

  1. 1つ目の理由はメモリ領域を有効に使うためである。
  2. 2つ目の理由はプログラムのエラーを未然に防止するためである。

クラスを型として宣言した変数には、そのクラスで定義されているメソッドを正しく呼び出しているかどうかも、コンパイラによってチェックされる。

C言語やC++で使えた機能が割愛された項目は

  1. GOTO文
  2. 明示的なポインタの使用
  3. 共用体の使用
  4. グローバル変数

進化したOOPの仕組み1―パッケージ

  • パッケージ―ただまとめるだけの入れ物
  • クラスの名前の重複を全世界で避ける重要な役割
  • パッケージの名前付けの規則―最初が国名、次に組織の種類、続いて組織名

進化したOOPの仕組み2―例外

戻り値とは違う形式で、メソッドから特別なエラーを返す仕組み

従来の方法の欠点

  • エラーコードの判定処理を書き忘れたり値を間違えた場合でも、コンパイラで見つけられない。
  • エラーコードを判定する同じようなロジックがサブルーチンで連鎖してしまうこと。
  • JAVAでのこの仕組みは、無駄を省くことと、間違いを防止する2つの効果がある。

進化したOOPの仕組み3-ガベージコレクション

  • OOPでは「たくさん作る」仕組みを利用することで、インスタンスを自由に作成することができますが、削除は慎重に行う必要がある。
  • インスタンスを削除する処理をシステムが自動的に実行する仕組みを採用している。
  • 間違いやすいメモリの解放処理を、言語の文法として提供せずにシステムが自動的に実行する。

OOPを生かすも殺すもプログラマの心掛け次第。

OOPの機能を生かせるかどうか、どうやったら保守がしやすく、再利用しやすくなるかを考える。

プログラムのメモリ領域は、静的領域、ヒープ領域、スタック領域の3つに分けて管理される。

静的領域は、プログラムの開始時に確保され、以降プログラムが終了するまでは位置が固定される領域である。

ヒープ領域はプログラムの実行時に動的に確保するためのメモリ領域です。英語のheapは「たくさん」「山ほど」といった意味。プログラムの開始時にたくさんのメモリ領域をあらかじめ確保しておく。
スタック領域はスレッドの制御のために使われるメモリ領域です。ヒープ領域は複数のスレッドから供用されますが、スタック領域はスレッドに1つずつ用意されている。
OOPで書かれたプログラムは、有限のメモリ領域であるヒープ領域をじゃぶじゃぶ使って動く。

インスタンスを作る命令(Javaではnew命令)が実行されると、そのクラスのインスタンス変数を格納するのに必要な大きさのメモリがヒープ領域に割り当てされます。この時インスタンスを指定して起動されるOOPのメソッド呼び出しを実現するため、インスタンスからメソッドエリアにあるクラス情報への対応付けも行われる。
インスタンスを格納する変数にはインスタンスそのものではなく、インスタンスの「ポインタ」が格納される。

3種類の変数の比較
項目 ローカル変数 グローバル変数 インスタンス変数
複数サブルーチンからのアクセス ×(できない) ○(できる) ○(できる)
アクセス可能範囲の設定 ○(一つのサブルーチンからしかアクセスできない) ×(プログラムのどこからでもアクセスできる) ○(同じクラス内のメソッドからのみアクセス可能と指定できる)
存在期間の長さ ×(サブルーチン呼び出し時に作られ、抜けるときに破棄される一時的なもの) ○(アプリケーションの開始から終了まで) ○(インスタンスが作られてから必要なくなるまで)
変数領域の複製 ×(1時点では1つしか作れない) ×(1変数につき1つしか作れない) ○(実行時にいくつでも作れる)

OOP三大要素のまとめ

3大要素
三大要素 クラス ポリモーフィズム 継承
説明 サブルーチンと変数をまとめてソフトウェア部品を作る メソッドを呼び出す側を共通化する 重複するクラス定義を共通化する
目的 整理整頓 無駄を省く 無駄を省く
覚え方 まとめて、隠して、たくさん作る仕組み 共通メインルーチンを作る仕組み クラスの共通部分を別クラスにまとめる仕組み