質問: 「**インスタンス化**」という**手順を取る理由の一つ**として「**効率的にオブジェクトを作成する為**」といわれております。 しかし、コンピューター側(メモリ側)から視点で言い換えると、**インスタンス化**とは「**メモリ領域の確保を効率良く、自動(?)でやってくれる**」というイメージの解釈で良いのでしょうか? お手数ですが回答の方、お願いします。 --- (訂正) すいません。質問文の中に >(メモリ内における)「非オブジェクト指向」と「オブジェクト指向」との違いとしては(イメージ的に言うと) >非オブジェクト指向⇒「データ」「処理(メソッド)」領域が、ごちゃごちゃに確保される。 >オブジェクト指向⇒「データ」「処理(メソッド)」領域が一つにまとめられて、インスタンス時に半自動(?)で領域が確保される。その為、効率良く、大量に確保できる。 >↑イメージとしては上記のような考えで良いのでしょうか? という質問内容がありましたが、私自身の誤りでしたので、上記の文は削除しました。 (訂正内容) この質問内容は「インスタンス化という手順を取る一つとして「効率的にオブジェクトを作成する為」といわれておりますが、コンピューター側(メモリ側)から見てみると、インスタンス化とは(言い換えると)「メモリ領域の確保を効率良く、自動(?)でやってくれるというイメージの解釈」で良いのでしょうか?」 という質問です。「非オブジェクト指向」と「オブジェクト指向」及び「オブジェクト」は関係ありませんでした。申し訳ありません。 お手数ですが、回答お願いいたします。 --- (追記)追記です。「**スッキリわかるJava入門**」「**Javaのオブジェクト指向がゼッタイにわかる本**」の書籍にもこのような内容は掲載されていましたよ。 「***スッキリわかるJava入門***」P301に掲載 > > なぜJavaでは「オブジェクト同士が連携する仮想世界」を作るために、わざわざ「クラスを定義して、そのクラスからオブジェクトを生成する」という複雑な手順を踏まなけれぱならないのでしょうか。 > > その答えに辿り着くために、私たちは「オブジェクトを大量に作る必要がある状況」を想像しなけれぱなりません。 > > > たとえば銀行で「すべての口座情報の複雑な統計を計算するプログラム」が動くとき、その仮想世界には何個の「口座」オブジェクトが必要でしょうか? > > 口座が1000あるなら1000個のオブジェクトを生み出す必要があるかもしれません。その1000個の口座オブジェクトそれぞれに対して、「属性として、残高・名義人・開設日があって・・・」という定義を繰り返す必要があるとしたら。それを作るプログラマの作業は膨人なものになります。 > > > そこでクラスの登場です。「属性として、残高・名義人・開設日があって・..」という定義をした「口座クラス」を1度作っておけぱ、このクラスから100個でも1000 > > 個でも必要な数だけオブジェクトを生み出すことができるのです。たとえぱ振り込みを受け付ける「Uketsukeクラス」を1つ準備しておけぱ、複数の受付係を生み出して、「並行して振り込み依頼を受け付ける」プログラムを作ることもできます > > > ***「Javaのオブジェクト指向がゼッタイにわかる本」***のP95に掲載 > > オブジェクト指向プログラミングでは、オブジェクトが基本になるのでした。そのオブジェクトはいきなり作成するのではなく、まずはオブジェクトの設計図であるクラスを記述して、その設計図を元にオブジェクトを生成していくというステップを踏むようになっています。なぜそのような面倒なステップを踏むようになっているのでしょうか? > > > それは、この題目のように、1つのプログラムの中に同じ種類のオブジェクトが登場するケースはソフトウェア開発の現場でもよく登場します。その際、各オブジェクトを1つ1つゼロから作成していくのはとても非効率でしょう。 > > コピー&ペーストを繰り返すのもミスを生みかねません。 > > それよりも、最初にそのオブジェクトの設計図を描いて(クラスを定義して)、その設計図を元に同じ種類のオブジェクトを”大量生産”していった方が効率的です。一度クラスを定義してしまえば、同じ種類のオブジェクトをいくつでも簡単に作り出せるのです。 > > そして、同じ種類のオブジェクトがもっと必要になったら、その都度設計図から、また新たにオブジェクトを”大量生産”して作成していけばよいのです。このようにクラスという仕組みを用いることで、プログラムの再利用が高まるというわけです。 > > > 後、オブジェクト指向プログラミング OOP(Object Oriented Programming)の基本的な仕組み – Device Configurationのサイトにも以下の内容が掲載されていました。 > > 変数領域の複製は実行時に幾つでも作ることができる。(インスタンスを作ることで、必要な数だけ変数領域を作ることができる) > > > 回答の方よろしくお願いします。
回答: こんにちは。 いまいち余計な回答な気がしますが、せっかくなので書いておきます。 質問では根本的に考えが間違っているところがあって、「オブジェクト指向」というのはプログラム設計の「考え方」であって、メモリがどうこうとは本質的に異なるレイヤ上の話です。 オブジェクト指向の考え方は、「メモリ」なんていうものが存在しない空間上でも議論が成り立つものなのです。 ふわっとオブジェクト指向を語ると、 * オブジェクトというのは、クラスによって性質を決定付けられた、手で触れる「データ」の単位です。 * インスタンスというのは、正確には「〇〇 (クラス) のインスタンス」と呼び、〇〇 (クラス) の性質を備えていることが分かっているオブジェクトのことを表します。 * インスタンス化とは、「〇〇 (クラス) に属するオブジェクトを見つけ出す (転じて、新たに創出する)」ことを指します。 * オブジェクトの性質 (クラスの定義) とは、オブジェクトが備えている「オペレーション」の集まりとみなします。 さて、どこに「メモリ」という概念が出てきたでしょうか?影も形もありませんね。 この「オブジェクト指向」という概念を「メモリと CPU を用いて駆動するプログラム」という現実に落とし込んだとき、 * オブジェクトとは、ヒープ領域 (メモリ) に格納された「データ」 * 〇〇 (クラス) のインスタンスとは、〇〇 (クラス) に定義されたメソッドやプロパティにより操作ができるオブジェクト * インスタンス化とは、クラスの定義に沿って、ヒープ領域 (メモリ) に新たな「オブジェクト」を生成すること * クラスの定義とは、実際的にはメソッドやプロパティのことで、オブジェクトに持たせるべきオペレーションの定義 となるわけです。 オブジェクト指向だろうと、非オブジェクト指向だろうと、最終的には「メモリと CPU を用いて駆動するプログラム」に落とされるわけで、それ以前の段階において「どのような考え方で設計を行うのか」の違いでしかありません。 ここで非オブジェクト指向と呼んでいるものは、メモリを確保/解放したり、データをメモリ上に配置したり、メソッドでメモリ上のデータを加工するなど、実際のコンピュータ環境を前提にした設計を考えたものとします。 そうすると、このような「コンピュータ環境」を考えずにプログラムを組めるということが、オブジェクト指向プログラミングの最大のメリットであると言えるでしょう。 例えば、「メモリの解放」という (物理的な) 操作も、自動化されているにせよされていないにせよ、「オブジェクトの消去」というオブジェクト指向の文脈上で語ることが可能です。 設計の上では最初から最後まで「オブジェクトの操作」にフォーカスし、メモリなどのローレベルな概念を考えずに済むというわけです。