オブジェクト指向
オブジェクト指向（オブジェクトしこう、）は、ソフトウェア工学構想の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方である。
1950年代後半にマサチューセッツ工科大学の人口知能研究グループの間で最初に発案され、プログラム開発環境の構築を通して体系化されていき、1960年代に一つのプログラミング・パラダイムとして確立された。1980年代にはデータベースとオペレーティングシステムの開発にも活かされるようになった。1990年代になるとソフトウェア設計の幅広い面にも応用されるようになり、ソフトウェア工学その他にオブジェクト指向を土台にした様々な分野が開拓された。
オブジェクト指向は脳機能を形成するニューラル・ネットワークをヒントに発案された。オブジェクトはニューロンの投影物であった。ニューロンはそれぞれが記憶を持ち、網の目のように結ばれて相互に影響し合い高度な思考を表現した。コンピュータ・プログラムも同様にオブジェクトのネットワークとして構築し、無数のオブジェクトが互いに作用し合うようにして任意のプロセスを実現する事がオブジェクト指向の理念であった。ここでのオブジェクトとは対象物を意味する言葉であり、対象物とは大まかにCPU演算処理（コード）が扱うデータ全般を指す。「どの様にデータを扱うか」ではなく「データがどの様に扱われるか」を念頭に置いてプログラムを組み立てる構想から、データにそれを扱う為のコードを付随させたオブジェクトの概念が生み出された。
オブジェクト指向プログラミング (1960年代から) オブジェクトデータベース (1980年代から) オブジェクト指向分析設計 (1990年代から) オブジェクト指向モデリング (1990年代から)
オブジェクト指向は、プログラミング・パラダイムとして誕生した知識体系であり、そのデータとコードのセットを基本要素にして物事を解析する考え方が、特に1980年代から大きく注目され始め、ソフトウェア工学のあらゆる局面にobject-oriented (OO) を接頭辞にした分野が立ち上げられた。他にも、OOオペレーティングシステム、OOプロジェクトマネージメント、OOソフトウェアエンジニアリング、OOユーザーインターフェース、ブーチメソッド、オブジェクトモデリングテクニックなど複数の分野が存在するが、上記リストの四種と知識範囲が重なり合っているか、または内包される副次分野となっていることから、明確な一つの分野として扱われることは少ない。
オブジェクト指向に基づいたプログラミングスタイルのことであり、Object-Oriented Programmingの頭文字をとってOOPと略されることもある。
以下はビャーネ・ストロヴストルップが提唱したC++系統のオブジェクト指向における三大要素である。Simula由来のクラス機構を根幹とする。のちにクラスベースオブジェクト指向の欠点を克服するためにプロトタイプベースオブジェクト指向も考案されたが、基本的な概念に差異はない。
なお、アラン・ケイが提唱したSmalltalk系統のオブジェクト指向とは異なる。
カプセル化 (encapsulation)
オブジェクトのデータと、データに関連する振る舞い（操作、関数あるいはメソッド）をひとまとめにすること、またそれらに対して外部からのアクセスを制御・限定すること。 アクセス権限（可視性）の種別はプログラミング言語によって異なるが、C++ではどのコード領域からもアクセス可能なpublic、自クラスと派生クラスからのみアクセス可能なprotected、自クラス内でのみアクセス可能なprivate、の三種を規定しており、C++の派生言語では類似のをサポートしていることが多い。
派生元オブジェクトに任意のデータとメソッドを追加する形で派生先オブジェクトを作る仕様（部品→全体）と、オブジェクトを複数の階層に分解して他オブジェクトと共有できる階層を派生元にする仕様（全体→部品）の二通りの考え方がある。継承によりデータ構造およびコードの再利用と拡張を可能にする。 クラスベースのオブジェクト指向では、派生元オブジェクトのデータ型はスーパークラスあるいは基底クラスなど、派生先オブジェクトのデータ型はサブクラスあるいは派生クラスなどと呼ばれる。また、継承は後述する多態を実現する仕組みでもある。
多態性 (polymorphism)
多態あるいはカナ表記でポリモーフィズムとも。同名メソッドの呼び出し時に、実際のオブジェクトの種類（クラス）によって処理内容が変化する機能。 通例、実行時の状況によって変化する「動的な多態」のことを指す。C++では仮想関数（仮想メソッド）のオーバーライドにより利用可能だが、内部的には仮想関数テーブルによるディスパッチを用いて実現されている。 多重定義（オーバーロード）をサポートする静的型付け言語では、メソッドの実引数として渡すオブジェクトの型に従って、呼び出されるメソッドが変化する「静的な多態」もあるが、こちらは実行時ではなくコンパイル時に動作が決まる。
まずオブジェクトの設計図となる任意のクラスを定義し、そのクラスを元にインスタンスを生成する方式である。
プログラム実行環境に用意されているインスタンスをプロトタイプとしてクローンし、任意のプロパティやメソッドを追加して拡張していく方式である。インスタンスベースとも言われる。
任意のインスタンス生成時に、実行環境に用意された様々な機能コンポーネントを追加する方式である。各コンポーネントは同時にスーパークラスと同等となり、手軽で重複の無い多重継承が保証された。
オブジェクト指向プログラミングは、歴史的に1962年に公開されたクラス構造を中心とするSimulaおよびその影響を受けて開発されたC++系統と、1970年代から研究開発が進められていたメッセージ・パッシングの仕組みを主体とするSmalltalk系統に大別されており、理想的なオブジェクト指向本来の形態を正しく表現しているのは後者のSmalltalk系統のほうだと評されていた。しかし、当時の計算機資源（CPU処理能力やメモリ容量など）の問題から、より少ないリソース下でも継承や多態などのオブジェクト指向機能を「クラス構造」を活かして実現できるC++系統のほうが主流となった。現に、システム開発でよく利用されるJavaやC#などのオブジェクト指向プログラミング言語は、いずれもC++から派生した言語である。
なお、Smalltalk開発者の一人であり、オブジェクト指向開発環境のパイオニアと見なされているアラン・ケイは「オブジェクト指向という用語の考案は悪い選択だった。メッセージ送信のもっと重要な考えを十分強調していない。」というコメントを残している[1][2]。
Smalltalkが主体とする「メッセージング」は、それ自体が高度に柔軟なカプセル化とポリモーフィズムの機能を自然に表現できる仕組みだった。それに対して、C++やJavaに見られる「クラス構造」と継承をベースにした同様の機能の実現はトリッキーと言えた。しかし、現実的に「クラス構造」重視の、言わば亜流のほうがオブジェクト指向の主流となってしまった以上、。オブジェクト指向言語の進化に伴い、オブジェクトとクラス構造の側面ばかりが強調される現状の中で、アラン・ケイは「自分自身もSmalltalkの大ファンではない。今日のたいていのプログラミングシステムに比べれば好ましいものだが。」とも述べて、当時目指したオブジェクト指向本来の支柱は「メッセージ・パッシング」であることを暗に示唆している。
構造化プログラミング アスペクト指向 エージェント指向 ソフトウェア工学 デザインパターン (ソフトウェア) Category:オブジェクト指向言語 オブジェクト指向プログラミング オブジェクトデータベース オブジェクト関係データベース オブジェクト指向モデリング オブジェクト指向分析設計 オブジェクトモデル化技法 UML（統一モデリング言語） ブーチメソッド CRCカード オブジェクト指向ソフトウェア工学 NEXTSTEP - オブジェクト指向OSとしてその先進性をアピール。後続OSや開発環境に大きな影響を与えた。 Cocoa - NEXTSTEPの後身のフレームワーク。