オブジェクト指向の概念
概念
- オブジェクト:インスタンスやクラスの総称
- クラス:オブジェクトを表現したもの(必要な変数とメソッドの内容を記載してある仕様書)
- インスタンス:クラスの実体(new Foo()自体、クラスを元にnewして実体になったもので実際の操作が可能)
オブジェクト指向を現実世界に置き換えて考える。
この世界は、全てオブジェクトで出来ている。
人間、車、パソコンなど全てがオブジェクトであり、その中でも人間と言う種類や、車という種類など様々な種類に分類できる。
人間と車は同じくオブジェクトだが、人間と車は違うものであり、人間とはどういうものか、車とはどういうものか、それを表現したものがクラスになる。
人間には四肢があり、頭があり、目、鼻、口がある。
無意識に心臓を動かし、呼吸をして、話す事ができる。
このように人間と言うクラスを定義したとする。(人間がどういうものかを表したクラスを作成)
私は、人間クラスの実体である。
つまり、私はインスタンス(new 人間())である。
私はオブジェクトであり、且つ人間クラスのインスタンスである。
私以外の人も、人間クラスのインスタンスである。
インスタンスは、ひとつとして同じものがない。
例えば、自動車販売店で販売されている車はインスタンスである。
同じ車種の同じグレードの車だとしても、一つ一つ少しずつ違う。
つまり、new 車()すると一つ一つ別の車として発生する。
プログラミングにおけるオブジェクト指向
上記の内容を改めてJavaをベースとして考える。
- Object:全てのものはObject。あらゆるClassがjava.lang.Objectを継承している事から明らかであり、ClassもInstanceも何もかもがObjectである。
- Class:型であり、Objectの製造基盤。ClassからObjectを製造することを、インスタンス化という。
- Instance: Classから製造されたObject。「~クラスのインスタンス」という言い方をする。
コンピュータは、「メモリ上の値」以外のものに対して操作も参照も実行もする事が出来ない。
「コンピュータが何かする」というのは、「メモリに対して何かする」という事になる。
インスタンス化(実体化)というのは、クラスという設計図に従って、「コンピュータが何か出来るような値をメモリ上に作る」ことを指している。
つまり、Javaのnewは指定されたクラスに従ってインスタンスをメモリ上に展開する働きをしている。
クラスはJavaソースプログラム上で人間が考えるためのオブジェクトであり、インスタンスはプログラム実行時のメモリ上でコンピュータが何かをするためのオブジェクトである。
そう捉えると、人間が考えるモノの多くは「オブジェクト」としてコンピュータで扱えるはずではないかというのが、オブジェクト指向という考え方と言える。
ちなみに、int型整数などの「基本型(primitive型)の変数」もオブジェクトだが、これらはJavaではクラスを書く必要がないオブジェクトである。
これらは、newでインスタンス化しなくても「メモリ上の値」として、コンピュータが扱う事が出来る。
こうした基本型の変数は、「基本型(というクラス)に従って、コンパイラがインスタンス化している」と言える。
オブジェクト指向のオブジェクトとは、「独立した機能体」というイメージであり、他のオブジェクトと部分的に混同する事は無く、オブジェクト間で何かをやりとりする時も、相手オブジェクトに侵入したり浸食したりする事がない。
オブジェクト指向以前のプログラミングでは、メモリ上は自由空間であり、誰がどんなアクセスをして書き換えているか、その管理は煩雑である。
オブジェクト指向では、全てのプログラムを「オブジェクト(の組み合わせ)」として作成する。
オブジェクトは互いに独立しているので、あるオブジェクトの持つメモリが、他のオブジェクトによって勝手に浸食されたりする事はない。
そして、そういうプログラムをJava等のプログラミング言語で書き表した時、それぞれのオブジェクトを「クラス」という書き方で表現すると決めた。
ソースコードに書かれたクラスは、コンパイルされて実行される。
この時、クラスを元にして作られたメモリ上のオブジェクトのことを、インスタンスと呼んでいる。
つまり、クラスもインスタンスも、どちらもオブジェクトになる。