クラス (コンピュータ)

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動

プログラミングにおけるクラス: class)とは、一つのプログラムの計算過程を構成する動的プロセスの実例(インスタンス)の集まり(クラス)、またはそれと同一視可能な言語上の構文を言う。クラス構文はオブジェクト指向プログラミングの基本である。

クラスの概念は、構造化プログラミングの技法としてオーレ=ヨハン・ダールによってSimula67において初めて導入された。

概要[編集]

構造化プログラミングにおいては、手続き(またはサブルーチン、関数、より一般にはブロック;block)の概念は「三つの知性の道具」の一つである抽象(abstract)を実現するにあたって基本的なものであるが、手続きやブロックは、一度呼び出して計算結果を返してしまうと、計算するために生成された動的プロセスは消滅しているため、その生成された動的プロセスをあとから参照することができない。

1970年頃、オーレ=ヨハン・ダールアントニー・ホーアは、手続きまたはブロックを呼び出すことで生成される動的プロセスの実例(インスタンス;instance)は、実体をもって存在している対象(object)として扱えるようにすることで動的プロセスの実例同士が相互作用可能となり、より広い範囲の概念をうまく表現することができると主張した[1]

ダールは、動作可能な実例の集まりを実例のクラス(class of instances)と呼び、手続き(またはブロック)を定義しているプログラムテキストから処理系が該当テキストを評価するごとに一つの動的プロセスの実例が生成されるという観察から、実例のクラスはそのプログラムテキスト自体と同一視できると主張し、「呼び出されたときだけではなくそのあとも存在し続ける動的プロセスの実例(インスタンス)」を生成する言語上の構文をクラス(class)と名付けた[2]。クラス構文はSimula67において初めて実装された。

クラスには、インスタンスの保持するデータメンバ変数フィールド[3]と操作(メソッドメンバ関数)が記述される[4]

クラスは、継承ポリモーフィズムカプセル化などの、オブジェクト指向プログラミングにおける重要な概念を実現する強力な手段である。

カプセル化 (encapsulation)[編集]

通常クラスには、インスタンスが持つデータと、そのインスタンスに対して行える操作が定義される。これらのデータや操作をばらばらに扱うのではなく、一つのクラスという単位に集約することで、データと操作の関連やインスタンスが持つ役割を明確にし、整理することができる。これをカプセル化という。

クラスを言語の機能として有するプログラミング言語の多くでは、クラスに定義されたデータ(フィールド)や操作(メソッド)に対してアクセス権を指定することで、クラスの外から直接扱えるフィールドやメソッドを制限することができる。これにより、クラスの外から不用意にフィールドの値が変更されたり不適切なメソッドが実行されたりしてしまうのを防ぐことができる。また、アクセスが制限されたフィールドやメソッドはクラスの外から見れば無いに等しいので、これらのフィールドやメソッドを修正してもクラスの外の部分には影響を与えずに済む。これを情報隠蔽という。

多くのプログラミング言語ではフィールドやメソッドの定義とアクセス権の指定は同時になされるため、カプセル化と情報隠蔽はしばしば混同される。

継承 (inheritance、extension、generalization)[編集]

あるクラスを基にして別のクラスをつくることを継承という。 継承は拡張ともいうことがあり、UMLでは汎化 (generalization) と呼んでいる。 継承の基になったクラスを親クラス基本クラススーパークラス等といい、継承してできたクラスを子クラス派生クラスサブクラス等という。

複数のクラスを基にしてクラスを継承することを多重継承という。多重継承は、二つのクラスの同名メソッドのオーバーライドによるコンフリクトを始めとするいくつかの問題点が指摘されており、JavaC#D言語等では実装多重継承はサポートされておらず、インタフェース多重継承のみサポートされている。

また、オブジェクト指向を効率よく使いこなすためには継承だけでなく集約 (aggregation)、委譲 (delegation) を理解する必要がある。

ポリモーフィズム (polymorphism)[編集]

継承する際に、親クラスの関数を子クラスの関数で置き換えることをオーバーライドという。オーバーライドをうまく使うと、オブジェクトによって、実質的に実行される関数が変わるようにできる。このようにして、見かけが一緒なのに動作が違うようにできることをポリモーフィズム(ポリモルフィズム)多様性多態性などという。

脚注[編集]

  1. ^ 構造化プログラミング(1975) pp.201-202
  2. ^ 構造化プログラミング(1975) pp.201-202
  3. ^ UMLでは「属性」ともいう。
  4. ^ プログラミング言語によっては、アクセス修飾子(access modifiers)が付与されることもある。

関連項目[編集]

参考文献[編集]

  • オーレ=ヨハン・ダール, C.A.R. ホーア (1972), 階層的プログラム構造 
    • E.W.ダイクストラ、C.A.R.ホーア、O.-J.ダール 『構造化プログラミング』 野下浩平訳、サイエンス社、1975年 (収録)
  • Ole-Johan Dahl (2001), The Birth of Object Orientation: the Simula Languages