1.オブジェクト指向とは 2.オブジェクト指向プログラミング

夏休み Java 勉強会資料
1.オブジェクト指向とは
Object Oriented (オブジェクト指向)は色々技術のことを指している。Java のようなプログラミング
言語、UML のような要求設計の図式表現、再利用可能なソフトウェア部品群(ライブラリ)、ソフトウェ
ア開発手法などなど。
というわけで、オブジェクト指向とはソフトウェア開発を円滑に、簡単にするための技術と考えて
間違いはない。
OO は物事を 1 つのオブジェクト(物)として考える。人間一人一人もオブジェクトと考えられる。
人は仕事を持ち、一人でできない仕事は複数の人間で協力し合う。会社もひとつのオブジェクトと
考えられる。1 社だけで出来る仕事もあれば、複数の会社が手を取り合って大きなプロジェクトを
成し遂げたりする。
このように、1 つ 1 つのオブジェクトはそれぞれ独立していて、それぞれ仕事、役割を持ってい
る。そしてそのオブジェクト同士がメッセージ(データ)をやり取りして協力し合い、全体として1つの
仕事をする、というのがオブジェクト指向の考え方である。
2.オブジェクト指向プログラミング
Object Oriented Programming(オブジェクト指向プログラミング)は上に書いた Java のような、オ
ブジェクト指向を取り入れたプログラミング言語のこと。Java のほかにもいくつかあるが今回は Java
の勉強会なので割愛。
OOP を理解するには、プログラミングの歴史を少し勉強しておいたほうがよくわかる。なので、ま
ず歴史を振り返っていくことにする。
2-1.プログラムの歴史
コンピュータというのは 2 進数でかかれた機械語しか理解できない。最初のころは今のような
Java や C 言語はなく、0 と 1 の 2 進数や 0 から F までの 16 進数を使って機械語を直接書いていく
しかなかった。ちなみに当時のコンピュータはめちゃくちゃでかく、処理速度もとても遅かった。
2 進数や 16 進数でプログラムを書く技術を取得するのは容易ではなかったので、もっと効率的
にプログラミングが出来るように出てきたのがアセンブリ言語。アセンブリ言語は人間がわかりやす
い記号でプログラムを書くことができ、それをアセンブラというプログラムを使って機械語に翻訳し、
コンピュータに仕事をさせる。
例)
MOV AX, X
MOV DX, Y
ADD AX, DX
MOV Z, AX
ただ、このアセンブリ言語は 1 つの命令文を間違うだけでもコンピュータが暴走したり、命令を
一つ一つ書いていく作業は非常にめんどくさかった。そこで次に、もっとわかりやすい、人間に親
しみやすい形式でプログラムを書くために高級言語が作られた。FORTRAN、COBOL などがそ
れにあたり、今でも所々で使われている。
プログラムは書きやすくなったが、それ以上にコンピュータの普及が進み、プログラムのニーズ
が増えすぎてしまい、このままだと手に負えなくなるだろうと言われるようになる。いわゆる「ソフトウェ
ア危機」と呼ばれるものである。
ソフトウェア危機に対応するため、新しいプログラミング言語が作られていくことになる。特に注
目を浴びたのが構造化プログラミングである。プログラムをよりわかりやすい構造にする、ということ
で、具体的な方法が3つ提唱された。
・ロジックの順次進行(プログラムを上から下へと順番に動作させていく
・ある条件の評価によって次の動作を決める条件分岐、いわゆる if や switch 構文
・一定回数もしくはある条件の評価になるまで同じ動作をさせる繰り返し、いわゆる for や while
これは「基本三構造」とよばれ、かなりシンプルな内容だったので幅広く支持されることになった。
が、今までのプログラムのほうがプログラムのサイズや実行速度が速かったので批判も出ていた。
しかし時代が進み、コンピュータの性能がうなぎのぼりに向上してきて、実行速度も殆どかわら
なくなったり、サイズもあまり気にならなくなっていった。それより、もっとわかりやすいプログラムを
作ることのほうが重要視されるようになっていった。
次に、プログラムの保守(改良)に強くするためにサブルーチンの独立性向上が工夫された。サ
ブルーチンというのは別名関数、メソッド等と呼ばれる、プログラムの複数の場所に出来る同じ命
令群を 1 つにまとめる技術である。ちなみにサブルーチンを呼び出すプログラムはメインルーチン
と呼ばれる。
独立性を高める、ということはサブルーチンをいろんな場面でメインルーチンから呼び出されて
も、メインルーチンがどんな状態でも関係なく動くようにする、ということ。独立性を高めるにはメイン
ルーチンとサブルーチンで共通して扱うデータ量、変数のデータを少なくすること必要がある。ち
なみに複数のサブルーチンが共有する変数のことをグローバル変数という。
変数はプログラムのどこで使われているかわかりにくく、変数をたくさん使えば使うほどプログラ
ムの保守性が低くなっていく。特にグローバル変数はプログラム全体で使えるためどこで変数に変
な値が入って動作がおかしくなるかが非常にわかりにくくなる。実際そうなった場合最悪プログラム
ソース全体を調べなければならなかった。
例)
サブルーチン1
呼び出し
値を返す
サブルーチン2
呼び出し
値を返す
サブルーチン3
値の変更
参照
グローバル変数
どこからどういうタイミングで
変更されているか
わからない!
こういう問題を解決するために 2 つの仕組みが考え出された。一つ目がローカル変数、もうひと
つが引数の値渡しである。
ローカル変数はサブルーチン内だけで使われる変数で、サブルーチンから抜けるときにデータ
は消滅する。
値渡しはサブルーチンに引数として渡すデータをコピーして渡す、つまり呼び出し側が参照し
ている変数を直接使わない仕組みである。これによりサブルーチン側で引数の値を変更しても呼
び出す側には影響がなくなる。
値渡し ( コピー )
例)
ローカル変数
サブルーチン 1
値渡し ( コピー )
引数
引数
ローカル変数
サブルーチン2
ローカル変数
サブルーチン3
これらの仕組みを取り入れ、色々な構造化言語が出現した。Pascal や C 言語もそれになる。
ここまで来ると、人間に親しみやすい形式のプログラムというのは殆ど出来上がった状態になっ
てきた。だが先に述べた「ソフトウェア危機」は収まらなかった。
そこで、次にプログラミング言語に求めたのは、出来上がったプログラムの理解、修正のし易さ
を考慮した、いわゆる保守性の向上だった。
この時代になると、プログラムはひとつ作られると長く使われるようになる、つまりプログラムの寿
命が長くなってきたため、既存のプログラムの修正に力を入れる必要が出てきたからだ。またその
ほかに、プログラムの複雑さを避けて、間違いを起こさないようにする品質向上、実績のあるプログ
ラムを使いまわして全体の生産性を上げる再利用性の向上も重要視されるようになった。
ただ、構造化プログラミングではこれらの要求にこたえられなかった。まず、グローバル変数の
問題がある。グローバル変数は先に述べたとおりどこからでもアクセスできてしまい、どこで修正さ
れたかわからなくなるため保守性の向上は見込めない。
また、再利用性が貧弱という問題もある。再利用できるところがサブルーチンしかなく、大半の
プログラムはメインルーチンを軸に作っているため、サブルーチンの再利用も限界があったからだ。
そして、それらの限界を打ち破るものが OOP である。
2-2.OOP の特徴
OOP には 3 つの特徴がある。クラス、ポリモーフィズム、継承である。これら 3 つをまとめて OOP
の三大要素という。
この3つの仕組みを簡単に言うなら「プログラムの無駄を省いて整理整頓する」仕組みだ。
いろんなところに色々なロジックを埋め込みまくった、わかりづらいプログラムは言わば散らかっ
て足の踏み場のない部屋であり、OOP はそれを整理整頓し、どこになにがあるかすぐわかるように
なり、無駄なものも一切省くことが出来る、という感じだ。