作成日 2008/1/27 最終更新日 2008/2/2
シャローコピーとディープコピー
ここではオブジェクトのコピー操作について説明します。
オブジェクトのコピー操作には2種類あります。1つがシャローコピー(Shallow
Copy)で、もう一つがディープコピー(Deep
Copy)です。それらがどのようなものであり、どのような特徴を持っているのかを説明します。
シャローコピーとディープコピーを説明するのに、図1のようなオブジェクトを元に説明しようと思います。
図1 シャローコピーとディープコピーを説明するための題材
(左上のオブジェクトがコピー対象のオブジェクト)
順番が逆になってしまいますが、まずはディープコピーから説明します(こっちの方が簡単だから)。
ディープコピーは、オブジェクトを丸ごとコピーします(図2を参照して。)。
図2 左上のオブジェクトをディープコピーしたときのイメージ図
(赤くなっているのはコピーして作成されたオブジェクトを表す)
■ディープコピーの特徴は以下のような感じです。
直感的にわかりやすい。
「わかりにくい ⇒
バグが発生しやすい」なので、直感的にわかりやすいというのは重要です。
一応、シャローコピーと比べて処理に時間がかかります。メモリの使用量も増えます。
しかし、オブジェクトが大きくない場合、無視して良いと思います。
常にディープコピーできるとは限らないです。
コピー対象オブジェクトがコピーできないオブジェクト(例えばシングルトンパターン にて実装されたクラスのオブジェクト)へ参照していたら、当然ディープコピーできない・・・。
■以下のようなときにディープコピーが使用されるかも。
デザインパターンのPrototypeパターン を使用するとき。
(シャローコピーの場合もあります。どちらを使用するかは場合によります)
よくわからんが、オブジェクトをディープコピーしたいと思ったとき。
(そのまんまでごめん)
ソースをわかりやすくしたいとき。
(シャローコピーはバグのものという気がします。)
説明しにくいので、図3を見て欲しいです。
オブジェクトのコピーはするのですが、コピーするのはコピー対象のオブジェクトのみです。そこから参照されているオブジェクトはコピーしません。
図3 シャローコピーをしたときのイメージ図
(赤くなっているのはコピーして作成されたオブジェクトを表す)
■シャローコピーの特徴は以下のとおりです。
ディープコピーより処理速度が速いです。メモリの使用量もディープコピーが少なくてすみます。
コピーした方から参照されているオブジェクトの属性値を変更した場合、元のオブジェクトから参照されているオブジェクトの属性値も変わります。(まあ、当然のことですが・・・。しかし、自分が使用しようとしている関数内でコピー操作が行われている場合、そのコピー操作がシャローコピーなのかディープコピーがわからない場合は危険です。)
(欠点)
直感的に判りにくい気がします。
そのため、コピー関数を作成し、その仕様を他の人に伝える場合、シャローコピーであることをしっかり伝えないと、バグの原因になる気がします。(2とほとんど同じ。)(欠点)
■以下のようなときにシャローコピーが使用されるかも。
デザインパターンのPrototypeパターン を使用するとき
(ディープコピーの場合もあります。どちらを使用するかは場合によります)
参照しているオブジェクトがすべてイミュータブル オブジェクト(例:java.lang.String クラスのオブジェクト)の場合、ディープコピーするのは無駄かも
よくわからんが、オブジェクトをシャローコピーしたいと思ったとき(そのまんまでごめん)
エクセルライブラリ内の(ほとんどの)オブジェクトはディープコピーが出来ないので、エクセルライブラリ内のオブジェクトを参照している自作のクラス(クラスモジュールやユーザフォーム)をディープコピーすることが出来ないと思う。
その場合はシャローコピーとするしかないと思います。
このページを作成する際に参考にしたページなどです。
注意:だるまがこれらのページを完全に理解しているとは思わないようにしてください。
このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方は
メール をお願いします。
Microsoft 、Windows 、Visual Basic および Excel は米国Microsoft
Corporationの米国およびその他の国における登録商標または商標です。
ここではExcel® をエクセル、Visual Basic® for Applications をVBAと表記する場合があります。
Mac 、Mac OS
、Mac OS
X は米国Apple
Computer,Inc.の登録商標または商標です。
Sun、Sun Microsystems、サンのロゴマーク、Java、及び、Sun/Solaris/Java に関連するすべての商標およびロゴマークは米国 Sun Microsystems, Inc. の米国およびその他の国における商標または登録商標です。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。
このホームページの作成者はこれらの会社とはいっさい関係がありません。