メルマガ ソフトウェア業界 新航海術 バックナンバー




ソフト会社の心臓

全バックナンバー


技術


開発プロセス

製品・サービス


組織


営業


財務


人事・労務


産業

 

第200号  2008/2/25 [オブジェクト指向再入門]

継承の仕組み

 

**************************************************************
_/_/_/_/_/_/_/ ソフトウェア業界 新航海術 _/_/_/_/_/_/_/_/_/
**************************************************************
第200号 2008/2/25 『継承の仕組み』
▼ まえがき
▼ [オブジェクト指向再入門] (1)OOPは従来技術からの飛躍ではない
▼ [オブジェクト指向再入門] (2)ヒープ領域の獲得・解放での違い
▼ [オブジェクト指向再入門] (3)継承を実現するための仕組み
▼ [オブジェクト指向再入門] (4)サブクラスのインスタンス化
▼ [オブジェクト指向再入門] (5)自分のメソッドの実行
▼ [オブジェクト指向再入門] (6)継承されたメソッドの実行
▼ 次回以降の予告
▼ メルマガ紹介


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
まえがき
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

蒲生嘉達(がもうよしさと)です。

2月12日に「ソフト会社の心臓」販売開始しました。
詳細は下記のページを参照してください。
http://www.kei-it.com/y_gamou/heart/


今回も引き続き、オブジェクト指向プログラミングについて解説します。
「オブジェクト指向でなぜつくるのか」(平澤章著、日経BP社発行)を
参考にしています。

「オブジェクト指向プログラミング」は本文では「OOP」と略します。
英語の'Object Oriented Programming'の略です。



*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (1)OOPは従来技術からの飛躍ではない
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

私は「オブジェクト指向でなぜつくるのか」での平澤章氏の下記の
主張に賛成します。

(1)下流工程のオブジェクト指向(OOP)、上流工程のオブジェクト指向
 (モデリング)、全体をカバーするオブジェクト指向(UML、開発
 プロセス)は、個別に見るとそれぞれ随分違うものである。

(2)OOPは決して従来技術からの飛躍ではなく、連綿と続いてきた
 プログラム言語の進化の延長線上にある。

(3)OOPは純粋なプログラミングの仕組みとして捉えるべきである。


第199号では、クラスが静的領域にロードされ、インスタンスが
ヒープ領域に生成される様子を見ました。

図1から図5まで( http://www.kei-it.com/sailing/2008/199.htm )を
見ると、上記(2)「OOPは決して従来技術からの飛躍ではない」が
実感できます。

例えば「図5:2つのインスタンス」
http://www.kei-it.com/sailing/2008/199.htm#5 は、Cで書かれた
プログラムが実行されているときのメモリの状態とそっくりです。



*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (2)ヒープ領域の獲得・解放での違い
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

但し、次の2点で大きな違いがあります。

一つは、Cではヒープ領域の獲得・解放をプログラム側で制御する
のに対し、OOPでは実行環境が制御するという点です。

具体的に言うと、Cでは malloc と free が必要なのに対し、
Javaでは new だけで済むということです。

 関連記事:第198号「インスタンスはヒープ領域に作られる」
 http://kei-it.tea-nifty.com/sailing/2008/01/post_6f91.html



*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (3)継承を実現するための仕組み
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

二つ目の違いはメソッドテーブルです。

「図3:姓の設定」 http://www.kei-it.com/sailing/2008/199.htm#3
で描かれているとおり、OOPではメソッドテーブル経由でメソッド
コードが呼び出されます。

一方、Cではプログラマが自前で関数ポインタテーブル経由で呼ぶような
制御ルーチンを作らない限り、直接関数コードが呼び出されます。


このように言うと、Javaプログラマは「自分はメソッドテーブル経由
ではなく、直接メソッドを呼んでいる」と言うでしょう。

メソッドテーブルはプログラマからは見えないからです。

では、なぜメソッドテーブルが存在するのでしょうか?

それは、継承とポリモーフィズムを実現するための仕組みだからです。

(他にも継承やポリモーフィズムの実現方法はあるようですが、ここでは
「オブジェクト指向でなぜつくるのか」にならってメソッドテーブルで
説明しています。)



*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (4)サブクラスのインスタンス化
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

「図6:継承」http://www.kei-it.com/sailing/2008/200-6.htm を
参照してください。

人クラスを継承している歌手クラスを想定して書かれています。
この継承は、Javaでなら次のような表記になります。

 class 歌手 extends 人{
}


「図6:継承」は、歌手インスタンス倖田來未が生成されたときの
メモリの状態です。
Javaでなら「歌手 倖田來未 = new 歌手();」が実行されたときの
メモリの状態です。

「図6:継承」では次のことが表現されています。


(A)コードのロード

歌手クラスのコード(デビュー曲設定メソッド、所属設定メソッドの
コード)は静的領域にロードされます。


(B)メソッドテーブル

歌手クラスのメソッドテーブルが静的領域に作られます。
そして、そのメソッドテーブルには次の二つが含まれます。
・人クラスのメソッドへのポインタ
・歌手クラスのメソッドへのポインタ

サブクラスのメソッドテーブルにはスーパークラスのメソッドへの
ポインタも含まれているということが重要です。


(C)インスタンス

歌手クラスから生成された歌手インスタンス倖田來未には、
人クラスのメンバ変数が継承されています。

つまり、歌手インスタンスには人インスタンスのメンバ変数
(姓、名、誕生日、性)が含まれています。



*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (5)自分のメソッドの実行
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

「図7:デビュー曲設定」http://www.kei-it.com/sailing/2008/200-7.htm
は、インスタンス倖田來未のデビュー曲変数に"TAKE BACK"を設定する
処理が実行される様子を表しています。

Javaでなら「倖田來未.デビュー曲設定("TAKE BACK");」が実行される
仕組みです。


(A)OSはインスタンス倖田來未に関連付けられているメソッドテーブルを
 参照する。
(B)そのメソッドテーブルの中でデビュー曲設定メソッドへのポインタを
 探す。
(C)見つかったら、そのデビュー曲設定メソッドを実行する。
(D)デビュー曲設定メソッドは、インスタンス倖田來未のデビュー曲
 変数に"TAKE BACK"を設定する。



*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (6)継承されたメソッドの実行
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

次に継承されたメソッドが実行される仕組みを見てみましょう。

「図8:継承されたメソッドの使用」
http://www.kei-it.com/sailing/2008/200-8.htm は、インスタンス
倖田來未の姓変数に"倖田"を設定する処理が実行される様子を表
しています。

Javaでなら「倖田來未.姓設定("倖田");」が実行される仕組みです。


(A)OSはインスタンス倖田來未に関連付けられているメソッドテーブルを
 参照する。
(B)そのメソッドテーブルの中で姓設定メソッドへのポインタを探す。
 →人クラスから継承された姓設定メソッドへのポインタを見つける。

(C)見つかった姓設定メソッドを実行する。
(D)姓設定メソッドは、インスタンス倖田來未の姓変数に"倖田"を
 設定する。


メソッドテーブルは、コードの重複を排除する役割を果たしている
ことが分かります。



*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
次回以降の予告
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

次回以降で、ポリモーフィズム、クラスライブラリ、フレームワーク
へと話を進めていきます。


次回発行予定は、3月初旬です。

乞うご期待!!



*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
 メルマガ紹介
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

私が購読しているメルマガの一つを紹介します。
経験に基づく様々なノウハウが盛り込まれています。

------------------------------------------------------------
「コンピュータシステムはなぜ機能しないのか?」
〜利益を大幅にアップさせるシステム設計の裏ワザ〜

SE、プログラマだけでなくユーザーを含むシステム開発に関わる全
ての方々へ。納得のいく、利益を生むシステム作りの裏ワザを業界
暦20余年のSEがマネジメント、プロジェクト管理、プログラミング、
保守、人材育成を踏まえて伝授します。相互紹介募集中です。

ご登録はこちらから
http://www.mag2.com/m/0000155977.html
------------------------------------------------------------



*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
本メルマガについて
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=

私は中小ソフトウェア会社の経営者なので、(特に日本の)ソフト
ウェア業界、ソフトウェア産業について強烈な興味を持っています。
技術面だけでなく、会計面、法律面、人事面など様々な面において・・・。

そして、私はものごとを見るときに次のことを心がけています。

・あるものをあるがままに見る。
 色眼鏡(例えば権威者の意見)でものを見ない。

・くっきりはっきり見る。
 複雑な現実も、ある観点から見ると、あるいはある角度から光を
 あてると、くっきりはっきり見えてくる。

・批判だけではなく、明るく前向きな解決策を提示する。


この視点で見えてきたことを本メルマガに綴っています。


本メルマガの内容に興味を持つであろう方をご存知なら、是非、
本メルマガの存在を教えてあげてください。

(以下をそのまま転送するだけです。)
---------------------------------------------------
【お勧めメルマガ ソフトウェア業界 新航海術】
⇒ http://www.mag2.com/m/0000136030.htm または
 http://kei-it.tea-nifty.com/sailing/ または
 http://www.kei-it.com/sailing/ 
--------------------------------------------------

このメールマガジンは『まぐまぐ!』 http://www.mag2.com/ を利用して
発行しています。配信中止はこちら http://www.mag2.com/m/0000136030.htm
(但し、慶社員には社内のメーリングリストで配信しています。)


バックナンバーは、発行者サイトまたはブログで、体系として
見てもらいたいので、「まぐまぐ!」でのバックナンバー公開は
最新号のみとなっています。

バックナンバーブログ:http://kei-it.tea-nifty.com/sailing/
発行者Webサイト: http://www.kei-it.com/sailing/
(発行者Webサイトではバックナンバーの全文検索も可能です。)


☆筆者の趣味のブログ:身近にいる小動物の図鑑☆
 http://kei-it.tea-nifty.com/small/




<< [第199号]    [全バックナンバー]     [オブジェクト指向再入門]    [第201号] >>
   

メルマガ登録ページ


まぐまぐ!ソフトウェア業界 新航海術 (マガジンID:0000136030)

(c)Copyright Kei Co.,Ltd All Right Reserved