}}
'''オブジェクト指向'''(オブジェクトしこう、{{lang-en-short|object-orientation}}<ref>[https://eow.alc.co.jp/search?q=object+orientation object orientationの意味・使い方|英辞郎 on the WEB:アルク]</ref>、[[複合形容詞]]: {{lang|en|''object-oriented''}})は、[[ソフトウェア工学]]構想理論の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方あるいは概念(コンセプト)である。
特に元々は[[プログラミング (コンピュータ)パラダイム|コンピュータプログラミング・パラダイム]]用におけるオブジェクト指向のエッセンスおよびコンセプト自体は考案された漠然的な構想であり、もともと19621967年に公開された[[Simula|Simula I]]と、その成功を受けて開発されたプログラミング言語「[[Simula|Simula 67]]で導入された」が持つ[[クラス (コンピュータ)|クラス]]機構を仕様が一つの発端とすされる<ref>[http://kristennygaard.org/FORSKNINGSDOK_MAPPE/F_OO_start.html How Object-Oriented Programming Started]</ref><ref>{{Cite web|url=http://www.olejohandahl.info/old/birth-of-oo.pdf|title=The Birth of Object Orientation: the Simula Languages|author=Ole-Johan Dahl|date=June 2001|accessdate=2019-02-02}}</ref><ref>[http://staff.um.edu.mt/jskl1/talk.html INTRODUCTION TO SIMULA]</ref><ref>{{Cite web|url=https://www.cs.cmu.edu/~charlie/courses/15-214/2014-fall/slides/25-history-oo.pdf|title=OO History: Simula and Smalltalk|author=Jonathan Aldrich and Charlie Garrod|date=2014|accessdate=2019-02-02}}</ref>。他方で「[[LISP]]」の影響を受けたという<ref>"Dr. Alan Kay on the Meaning of Object-Oriented Programming". 2003. Retrieved 11 February 2010.</ref>計算機科学者[[アラン・ケイ]]が、1972年から「[[Smalltalk]]」の開発を進める中でオブジェクト指向という言葉を初めて定義した。彼によるとオブジェクトとは占有記憶(データ)とそれを操る動作(コード)を持ち、メッセージを相互に送受して任意の処理を実現し、上述の[[クラス (コンピュータ)|クラス]]から生成されるとされた。この[[オブジェクト (プログラミング)|オブジェクト]]を中心にしてシステムを組み立てる考え方がオブジェクト指向という事になる。また「[[Simula|Simula 67]]」の影響を受けた[[ビャーネ・ストロヴストルップ]]のが1983年に公開した「[[C++]]」が契機となり、オブジェクト指向を規定する為の三大原則([[アカプセル化]]、[[継承 (プログラミン・ケイグ)|継承]]の、[[Smalltalk多態性]]によってオブジェクト指向)が再定義提唱された。
オブジェクト指向はその後[[データベース]]や[[オペレーティングシステム|OS]]の設計・開発などにも活かされるようになり、1990年代になるとソフトウェア工学の幅広い面にも応用されて、オブジェクト指向を土台にした様々な分野が開拓された。
==起源==
{{Main|オブジェクト指向プログラミング}}
=== オブジェクト 生成指向の 種類三大原則 === ▼
=== 主な要素 ===
以下は[[ビャーネ・ストロヴストルップ]]が提唱した[[C++]]系統のオブジェクト指向における三大要素<!-- 原則ではなく要素。 -->である。[[Simula]]由来の[[クラス (コンピュータ)|クラス]]機構を根幹とする。のちに[[クラスベース]]オブジェクト指向の欠点を克服するために[[プロトタイプベース]]オブジェクト指向も考案されたが、基本的な方向性に大きな差異はない。
* [[カプセル化]] (encapsulation)
: オブジェクト内のデータ参照とメソッド呼出に対する、外部からのアクセスを制限する仕様。[[オブジェクト (プログラミング)|オブジェク]]アクセス権限(可視性)の種別はプログラミング言語によって異なる<ref>C++ではどのコード領域からもアクセス可能な''public''、自クラスと派生クラスからのみアクセス可能な''protected''、自クラス内でのみアクセス可能な''private''、の三種を規定しており、C++の派生言語では類似の{{仮リンク|アクセス修飾子|en|Access modifiers}}をサポートしていることが多い。</ref>。 ▼
: [[オブジェクト (プログラミング)|オブジェクト]]のデータと、データに関連する振る舞い(操作、[[サブルーチン|関数]]あるいは[[メソッド (計算機科学)|メソッド]])をひとまとめにすること、またそれらに対して外部からのアクセスを制御・限定すること<ref>[http://e-words.jp/w/%E3%82%AB%E3%83%97%E3%82%BB%E3%83%AB%E5%8C%96.html カプセル化とは - IT用語辞典]</ref>。
▲: アクセス権限(可視性)の種別はプログラミング言語によって異なる<ref>C++ではどのコード領域からもアクセス可能な''public''、自クラスと派生クラスからのみアクセス可能な''protected''、自クラス内でのみアクセス可能な''private''、の三種を規定しており、C++の派生言語では類似の{{仮リンク|アクセス修飾子|en|Access modifiers}}をサポートしていることが多い。</ref>。
* [[継承 (プログラミング)|継承]] (inheritance)
: 通例、実行時の型(動的な型)に応じて呼び出されるコードが決定される「動的な多態性」のことを指す<ref>C++では同じ[[シグネチャ]]を持つ仮想関数(仮想メソッド)の[[オーバーライド]]により動的な多態性を利用できるが、内部的には通例[[仮想関数テーブル]]による動的ディスパッチを用いて実現されている。仮想メソッドのオーバーライドでは1変数に関する動的ディスパッチしかできないが、2変数以上に関する動的ディスパッチ([[多重ディスパッチ]])の仕組みをサポートする言語もある。</ref>。
: [[静的型付け]]言語において、メソッドの実引数として渡すオブジェクトの型に従って、呼び出されるメソッドが選択される[[多重定義]](オーバーロード)<ref>[[被演算子]]を演算子関数の引数とみなし、ユーザー定義の演算子オーバーロードをサポートする言語もある。言語組み込みの演算子も被演算子の型に応じてコードが変化するため、これも演算子オーバーロードの一種である。</ref>や、[[ジェネリックプログラミング]]において、型引数に応じて生成されるコードが変化する{{仮リンク|パラメータ多相|en|Parametric polymorphism}}なども多態性の一種と見なされる。これらは「静的な多態性」に分類され、実行時ではなくコンパイル時に動作が決まる。
* [[クラスベース]]
: まずオブジェクトの設計図となる任意の[[クラス (コンピュータ)|クラス]]を定義し、そのクラスを元に[[インスタンス]]を生成する方式である。
* [[プロトタイプベース]]
: プログラム実行環境に用意されている[[インスタンス]]をプロトタイプとしてクローンし、任意のプロパティやメソッドを追加して拡張していく方式である。インスタンスベースとも言われる。
* [[ミックスイン]]
: 任意のインスタンス生成時に、実行環境に用意された様々な機能コンポーネントを追加する方式である。各コンポーネントは同時にスーパークラスと同等となり、手軽で重複の無い多重継承が保証された。
=== オブジェクト指向とメッセージング ===
|