作成日 2008/1/27
最終更新日 2008/2/2

シャローコピーとディープコピー

 ここではオブジェクトのコピー操作について説明します。
 オブジェクトのコピー操作には2種類あります。1つがシャローコピー(Shallow Copy)で、もう一つがディープコピー(Deep Copy)です。それらがどのようなものであり、どのような特徴を持っているのかを説明します。

1.題材の説明
2.ディープコピーとは
3.ディープコピーの特徴や利用シーン
4.シャローコピーとは
5.シャローコピーの特徴や利用シーン
6.参考文献


1.題材の説明

 シャローコピーとディープコピーを説明するのに、図1のようなオブジェクトを元に説明しようと思います。

題材
図1 シャローコピーとディープコピーを説明するための題材
(左上のオブジェクトがコピー対象のオブジェクト)
 
このページのトップへ

2.ディープコピーとは

 順番が逆になってしまいますが、まずはディープコピーから説明します(こっちの方が簡単だから)。
 ディープコピーは、オブジェクトを丸ごとコピーします(図2を参照して。)。

 ディープコピーをしたときのイメージ図
図2 左上のオブジェクトをディープコピーしたときのイメージ図
(赤くなっているのはコピーして作成されたオブジェクトを表す)

このページのトップへ

3.ディープコピーの特徴と利用シーン

■ディープコピーの特徴は以下のような感じです。
  1. 直感的にわかりやすい。
    「わかりにくい ⇒ バグが発生しやすい」なので、直感的にわかりやすいというのは重要です。
  2. 一応、シャローコピーと比べて処理に時間がかかります。メモリの使用量も増えます。
    しかし、オブジェクトが大きくない場合、無視して良いと思います。
  3. 常にディープコピーできるとは限らないです。
    コピー対象オブジェクトがコピーできないオブジェクト(例えばシングルトンパターンにて実装されたクラスのオブジェクト)へ参照していたら、当然ディープコピーできない・・・。
■以下のようなときにディープコピーが使用されるかも。
  1.  デザインパターンのPrototypeパターンを使用するとき。
    (シャローコピーの場合もあります。どちらを使用するかは場合によります)
  2. よくわからんが、オブジェクトをディープコピーしたいと思ったとき。
    (そのまんまでごめん)
  3. ソースをわかりやすくしたいとき。
    (シャローコピーはバグのものという気がします。)
このページのトップへ

4.シャローコピーとは

 説明しにくいので、図3を見て欲しいです。
 オブジェクトのコピーはするのですが、コピーするのはコピー対象のオブジェクトのみです。そこから参照されているオブジェクトはコピーしません。
 
シャローコピーをしたときのイメージ図
図3 シャローコピーをしたときのイメージ図
(赤くなっているのはコピーして作成されたオブジェクトを表す)

 
このページのトップへ

5.シャローコピーの特徴と利用シーン

■シャローコピーの特徴は以下のとおりです。

  1. ディープコピーより処理速度が速いです。メモリの使用量もディープコピーが少なくてすみます。
  2. コピーした方から参照されているオブジェクトの属性値を変更した場合、元のオブジェクトから参照されているオブジェクトの属性値も変わります。(まあ、当然のことですが・・・。しかし、自分が使用しようとしている関数内でコピー操作が行われている場合、そのコピー操作がシャローコピーなのかディープコピーがわからない場合は危険です。) (欠点)
  3. 直感的に判りにくい気がします。
    そのため、コピー関数を作成し、その仕様を他の人に伝える場合、シャローコピーであることをしっかり伝えないと、バグの原因になる気がします。(2とほとんど同じ。)(欠点)

■以下のようなときにシャローコピーが使用されるかも。

  1. デザインパターンのPrototypeパターンを使用するとき
    (ディープコピーの場合もあります。どちらを使用するかは場合によります)
  2. 参照しているオブジェクトがすべてイミュータブルオブジェクト(例:java.lang.Stringクラスのオブジェクト)の場合、ディープコピーするのは無駄かも
  3. よくわからんが、オブジェクトをシャローコピーしたいと思ったとき(そのまんまでごめん)
  4. エクセルライブラリ内の(ほとんどの)オブジェクトはディープコピーが出来ないので、エクセルライブラリ内のオブジェクトを参照している自作のクラス(クラスモジュールやユーザフォーム)をディープコピーすることが出来ないと思う。
    その場合はシャローコピーとするしかないと思います。
このページのトップへ

6.参考文献

 このページを作成する際に参考にしたページなどです。
 注意:だるまがこれらのページを完全に理解しているとは思わないようにしてください。

番号

リンク先の名称

リンク先の説明

リンクした日

1 Javaの道:配列(2.配列のコピー) 配列(※Javaでは配列もオブジェクトです)のコピーについて説明しています。 2008/2/2
2 @IT: BOOK Preview:Code Complete 第2版 第6章 クラスの作成  シャローコピーよりディープコピーを薦めています。詳細は・・・、自分で読んでください。 2008/2/2
3 Prototype パターンデザインパターン[モデリング] -TECHSCORE- Prototypeパターンについて解説しています。 2008/2/2

番号

著者名

書籍名

ISBN

1 結城 浩 増補改訂版Java言語で学ぶデザインパターン入門 4-7973-2703-0


Prev Up Next  Top
このページのトップへ

このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方はメールをお願いします。

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. の米国およびその他の国における商標または登録商標です。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。

このホームページの作成者はこれらの会社とはいっさい関係がありません。