オブジェクト指向プログラミングとは
はじめに
C言語のようなプログラミングスタイルは,「手続き指向プログラミング」と呼ぶ.
ある1つの機能を関数というかたちでサブルーチン化し,
それらを組み合わせることで,1つのを作り上げていくスタイルである.
プログラミングのスタイル
○手続き指向 ・・・ C言語,Basic,
◎オブジェクト指向 ・・・ Java,SmallTalk...
一方,Javaは「オブジェクト指向プログラミング」のスタイルを持つ.
ここでいきなり,「オブジェクト=もの?」と考え出すと,わかりにくくなるので,
C言語との違いから説明する.
手続き指向プログラミングの欠点
まず,Cプログラミングとは関数と変数の組み合わせ作業と言い換えることができる.
しかし,大規模なシステム開発においてこのスタイルでは,以下の点で困難さを生じる.
- 名前衝突の問題
- 関数-関数間,関数-変数間,変数-変数間の関連性
1は,グローバルな関数(変数)では,同じ名前が使えないということ.
2は,他のどの関数や変数と関係があるか..ということである.
C言語では,これらを人間が設計段階において把握したり,ファイル単位でモジュール化するといった方法で対応する.Java(オブジェクト指向言語)はクラスという概念を導入し,これらの問題に言語的に対応している.
手続き指向言語の欠点
●名前衝突 ・・・ 同じ名前の関数は使えない → グループで開発するときは注意!
●関連性の把握 ・・・ 作成した関数(変数の)関係把握は,言語的にサポートできない
例) 次の関数・変数を宣言した状況を考えよう.
文字の長さを検出する関数 strleng()
文字の長さを格納する変数 int leng1
ループの回数をあらわす int i
strleng() と leng1 は文字の情報を扱う点で関連があるが,
言語的には i も leng1 も strleng() も同列といえる.
クラス
Cでは,ファイルと言う単位でモジュール化に対応するが.
Javaでは,クラスという概念でモジュール化が行える.
ここでいうクラスとは,C言語の構造体ににており,
- 関数(メソッド)と変数の集合体
- 各関数や変数に公開(Public)や非公開(private)という属性を持たせられる
という特徴をもつ.(ほんとはもっともっとあるんだけど,ここは入門レベルなので....)
1により,関連性のある関数や変数だけを同じクラスに配置すればよく,関連性がはっきりする
これらの関数を呼び出す時には,Javaでは
クラス名.関数名
クラス名.変数名
という呼び出しかたになるので,名前が重複することはなくなる.
結局オブジェクト指向って?
このように,オブジェクト指向言語では,開発者は自分のクラスの中で自由に関数名を宣言できて
容易に,公開や非公開を宣言できるわけだ.
結局,何が「オブジェクト」指向なのか・・・?
つまり,あるシステムを作成する時,何をクラス(モジュール)にするかが重要であり,
その考え方として,プログラムを「機能」の組み合わせじゃなくて,「物」の組み合わせと考えましょうということ.
たとえば,ボタンはGUIを構成する「物」の1つであり,Javaにおいても,ボタンはクラス化されている.
オブジェクト指向言語の難しさとは
Cだったら,変数のタイプ(int, char など)や関数の機能(引数,戻り値)を理解すればOKだが,
オブジェクト指向言語は,クラスがベースになっている.
変数だけ...,関数だけ...というのは原則的にないといってもいい.(int とか基本的なのはあるけど)
つまり,変数→オブジェクト.関数→オブジェクトのメソッドという考え方だ.
で,Javaなどのオブジェクト指向言語の難しいところは,
- 自分が使いたい関数(メソッド)がどのクラスにあるのか?
- 自分が扱おうとするクラスはどんなメソッドや変数を持っているのか?
- そのクラスはどのように扱うのか
を理解しなければいけないということにある.
まとめ
- 手続き指向プログラミング=関数,変数の組み合わせ
- オブジェクト指向プログラミング=クラスの組み合わせ
- クラス=関数+変数