• 締切済み

オブジェクト指向って何ですか?

kokucho81の回答

  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.1

過去にも似たようなしつもんがありますが、プログラマ向けに説明されたものが多く、少し難しいかもしれません。 ここでは、私自身も文系出身で、プログラムを学んでいった人間ですので、説明致しましょう。 オブジェクト指向とは、何か?という前に、「オブジェクト指向」という考え方の位置付けを知りましょう。 オブジェクト指向という考え方は、ソフトウェア(プログラム)が巨大化するにしたがって、それまでのプログラム技法(構造化プログラム)だけでは、管理しきれないということから、ここ10年で一気に注目を集めてきた概念です。 その誕生自体は、30年以上もまえにさかのぼりますが、実際の現場のプログラマに使われ始めたのは、ここ10年と言って良く、プログラマ開発メンバほぼ全員に浸透したという意味では、ここ5年程度といえると思います。 ですから、実際問題として、「オブジェクト指向型言語で15年以上プログラムしている」という人はほとんど皆無であり、「10年」というひともほとんどいないはずです。 そう言う意味では、私も含め、偉そうなことを行っている人達も、ついぞ最近(ここ10年ほどの間に)学んだことであるには違いないのです。 さて、では本題にうつりましょう。 オブジェクト指向を語る上で、おおきく3つに分けることが出来ると思います。 (1)オブジェクト指向という考え方 (2)オブジェクト指向をサポートするのに必要な機能 (3)オブジェクト指向をサポートするのに必要な機能を備えるプログラミング言語 ★(1)オブジェクト指向という考え方  オブジェクト指向とは、特定の機能を持つオブジェクトが自立する、ということです。ハイ。何の事かわかりませんね。例を使ってみましょう。 オブジェクト指向「でない」考え方とは、どのようなものでしょう。 例えば、「Aさん」の「身長」で例にとり考えてみましょう。 オブジェクト指向ではない考え方では、「Aさん」は、自立していません。 ですから、「Aさん」は、自分で身長をしりません。 そこで、身長を計るための機械(=関数)を別に用意してやり、「Aさん」をここにたたせてやる必要性があります。 すなわち、「Aさん」を「身長の計測器」に乗せてその身長を得るのです。このように「Aさん」が自立していないと、手取り足取り面倒がかかってしょうがないのです。 では、オブジェクト指向「である」考え方とはどのようなものでしょう。 オブジェクト指向では、「Aさん」は、自立しています。 ですから、「Aさん」は、自分で身長を知っています。 ですから、「Aさん」には「身長の計測器」は不必要です。 「Aさん」から身長を得るには、「Aさん、あなた身長は?」と訪ねれば良いだけです。そうすれば、「Aさん」はつつがなく、「何センチです」と答えてくれるでしょう。 この両者の違いが、オブジェクト指向と、そうでないものの根源的違いです。 (2)オブジェクト指向をサポートするのに必要な機能 オブジェクト指向をサポートするために最も必要なこととは何でしょう。 「Aさん」が自立できなかったことと、自立できたことの違いとは、なんなのでしょう。 身長の例で考えてみましょう。 「Aさん」が身長に関して、自立するためには、「身長」という情報と「身長を尋ねられたときの受け答え」について、「Aさん」自身が保持していればよいはずです。 「Aさん」像 〔   ★値★  身長=170センチ   ★行動★ 身長を尋ねられたときの受け答え=“私の身長は”+★値★+“です。” 〕 これで、「Aさん」は身長について自立することが出来ました。ほかにもいっぱい付け足していけば、それだけ「Aさん」はいろいろなことについて、自立できそうですね。 これがオブジェクト指向プログラムの、もっとも根源的ポイントです。 他にも様々な概念がありますが、それらはこの考え方を根本とした派生的、拡張的な概念に過ぎません。 一般的にはオブジェクト指向には次の概念が含まれることが望ましいといわれます。  カプセル化・抽象・継承・ポリモーフィズム ★カプセル化★ カプセル化とは、先ほどの例でいうと、「Aさんの中」と「Aさんの外」をはっきりと区分けして、そとから「Aさんの中」をひっかきまわすことができないようにすることです。 たとえば、外から、勝手に、「Aさん」の身長を150センチにかえたりすると、えらくまずいことになるということがわかります。「Aさん」が自分で身長を知っている意味がなくなってしまいます。 ですから、そのようなことが出来ないようにする仕組をカプセル化といいます。 ★抽象★とは、物事に対して、共通の性質を見つけ、より抽象化することです。(そのままや) 例えば、「ビデオデッキ」と、「コンポ」には、 電源・再生・巻き戻し・はや送り、一時停止・停止・記録 という機能が共通の機能としてあることがわかります。 ですから、「ビデオデッキ」や「コンポ」ではない、モット何か、抽象的な何か概念のようなものがそこにあるということがわかります。こういったことをすることを「抽象」と言います。 ★継承★とは、ちょうど、抽象の逆にあたります。 例えば、 「人類」というのはとても、抽象された概念です。 ここから、 「日本人」「アメリカ人」「中国人」などなど色々な派生概念があることがわかります。 ここで「人類」と「日本人」の「差だけ考えて共通部分は利用する」のが継承です。 「人類」と「日本人」の差とは、 日本人は、「人類」中、ちょっと身長が低い・・・ 日本人は、「人類」中、ちょっと数学に強い・・・ 日本人は、「人類」中、ちょっとお金持ち・・・ だから、日本人は、「人類の共通の性質」+「上のような特殊な性質」と言い表せます。人類の共通の性質は、目が二つとか、耳も二つ~、とか、恒温で~とかいろいろありますが、そういうあたりまえの部分は「継承を使用すれば全て省略できる」ことがわかります。 アメリカ人は、「人類」中、ちょっと身長が高い・・・ アメリカ人は、「人類」中、ちょっと自己中・・・ アメリカ人は、「人類」中、ちょっと発想が自由・・・ アメリカ人も、「人類の共通の性質」+「上のような特殊な性質」と言い表せます。日本人の時と同様に、基本的な性質が全て省略かのうであり、差分だけ考えれば良いことがわかります。 ★ポリモ-フィズム★とは。。。なんだか言葉が意味不明ですね。 しかし、概念は難しくありません。 先ほどの、日本人、アメリカ人、中国人などを例にとって考えてみましょう。 このいろいろな国の人達に、一列に整列してもらいましょう。 そして、前から順番に挨拶してもらいます。 このとき、あなたは、ただひとこと、「挨拶しろ!」と号令をかけるだけです。 すると、 日本人は「こんにちは!」 アメリカ人は「HELLO!」 中国人は「ニーハオ!」 といってくれるのです。あなたは、どこの国の人かは意識していません。 あなたは、ただただ、「挨拶しろ!」といっただけにもかかわらず、 それぞれの人達は、自分の国の言葉で挨拶してくれました。 これが「ポリモーフィズム」です。 「オブジェクトが自立している!」という根源的概念がここに見え隠れしています。 もし、オブジェクト指向でなければ、「あなたは日本人だから、日本人的な挨拶」「あなたはアメリカ人だから、アメリカ人的な挨拶」と手取り足取り教えてあげなくてはならなのです。オブジェクト指向っていいですね♪ (3)オブジェクト指向をサポートするのに必要な機能を備えるプログラミング言語 さぁ、最後になりました。 オブジェクト指向をサポートする言語はいろいろあるのですが、 現在多くの人に広く使用されている、となると数はそれほど多くはありません。 まず、オブジェクト指向言語の代表格としては、「Java言語」があります。 「Ruby言語」なども存在します。 この2つの言語は「オブジェクト指向言語」としてかなり高い完成度を持っています。これらは、「美しい」という言葉がふさわしい言語です。 次にオブジェクト指向的考え方をサポートする言語です。 これの代表格は「C++」です。世界でもっとも多くのプログラマが使用している言語であり、非常に「コンピューターちっく」なことから、先ほどのオブジェクト指向のような「抽象的」なことまで、幅広くサポートする、「強力」という言葉がふさわしい言語です。 次に「Perl言語」です。Perl言語はバージョン5から、オブジェクト指向的考え方をサポートしました。このPerl言語は、「C++」が弱いような分野で非常に力を発揮しており、これは「柔軟」という言葉がふさわしい言語です。 そう、まさに、「剛」と「柔」! 「ラオウ」と「トキ」!(う~ん 古!) いやまぁ、そういうことはどうでもいいとして・・・ 他にも、「PHP」「ObjectPascal」など様々な言語が存在します。いろいろと自分で発見してみてください。

関連するQ&A

  • 【オブジェクト指向について】

    【オブジェクト指向について】 こんにちは。初めて質問をさせていただきます。 さて、ただいまVBを勉強中なのですが、オブジェクト指向のところで躓いてしまいました。 質問したい事は以下の点です。 (1) オブジェクト指向の理解について   オブジェクト指向とは、プログラミングをするときに変数や機能などをクラスというものに格納しておくことで、プログラミングを円滑にすすめるための概念であると理解していますが、この理解は正しいのでしょうか? ご回答お待ちしております。よろしくお願いいたします。

  • オブジェクト指向という考え方がいまいちわかりません。

    オブジェクト指向という考え方がいまいちわかりません。 オブジェクト指向とは一体どういう意味なのでしょうか? また、いわゆるオブジェクト指向の言語(Javaなど)とそうでない言語(PL/SQLなど?)との違いも合わせて教えていただけないでしょうか? 宜しくお願い致します。

  • オブジェクト指向とUMLについて

    オブジェクト指向がうまく理解できず苦労しています。 Javaの解説書にはよくUMLについても記載されているものをよく見かけますが、UMLはオブジェクト指向を理解するのに役立ちますか? それともオブジェクト指向を理解したうえで活用するための技術ですか?

    • ベストアンサー
    • Java
  • オブジェクト指向

    オブジェクト指向がわからなくてもPHPは学習できますか? 理解できますか?

    • ベストアンサー
    • PHP
  • オブジェクト指向について

    オブジェクト指向とは 分かりやすく説明するとどういうことですか? 明日までに理解しなければならないのですが、 一から分かりやすく説明頂けないでしょうか? よろしくお願いします!!

    • ベストアンサー
    • Java
  • オブジェクト指向ではない指向は、何指向と言う?

    プログラミングでオブジェクト指向ではない指向は、何指向と言うのですか?

  • オブジェクト指向とは

    オブジェクト指向の本をたくさん読んでみましたが 全部書いてあることが難しくていまいちピンときません。 要は簡単にいうと、クラスを作ってその中にメソッドを 作ってロジックの中でその中のクラスを使い分けていく という考え方がオブジェクト指向というのでしょうか? 簡単でいいのでわかりやすくオブジェクト指向というのを教えていただけないでしょうか?友人に聞くとオブジェクト指向を説明すると2時間はかかると言われてしまいました。

    • ベストアンサー
    • Java
  • オブジェクト指向について

    オブジェクト指向について オブジェクト指向について、頭があまり良くない僕でもわかるような説明もしくはサイトを教えて頂けないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java
  • オブジェクト指向について

    オブジェクト指向に対応したプログラミングはいっぱいあるけどオブジェクト指向の考え方を考えた人はだれなのですか?!

    • ベストアンサー
    • Java
  • オブジェクト指向とは?

    お世話になります。 VB.NETはオブジェクト指向言語であると聞きました。しかし、VB6.0はそうではないという話を耳にしました。 一部では、6.0もオブジェクト指向言語であるとも聞いたのですが、実際のところどうなのでしょう? どうであれば、オブジェクト指向言語と言えるのでしょうか?