シャローコピーとディープコピーの違い

なにそれ?

シャローコピー(Shallow Copy)、ディープコピー(Deep Copy)、どちらもコピーすることには変りないのですが、何をコピーしているのかが違います。
はじめて聞いた人は何を言っているか訳がわからないと思いますが、
特にオブジェクト指向プログラミングにおいて、これを知らないと確実にハマります。

シャローコピー

シャローコピーというのは、コピー元のオブジェクトとコピー先のオブジェクトがメモリ上の同じデータ(インスタンス変数)を参照しています。
分かりにくいと思うので、図で示すとこんなイメージでしょうか。
f:id:kuro_m88:20110115001010p:image
ですので、コピー元のオブジェクトに対してインスタンス変数に変更を加えると、コピー先のオブジェクトが参照しているデータが同じ物なので、コピー先のオブジェクトから見たインスタンス変数も変更されることになります。
シャローコピーは、参照のコピーのみを行うということですね。

ディープコピー

一方、ディープコピーはどうでしょう?
ディープコピーは、オブジェクトのみのコピーではなく、オブジェクトとメモリ上のデータ(インスタンス変数)の両方をコピーするので、ディープコピーすると、図のような感じになります。
f:id:kuro_m88:20110115005134p:image
二つのオブジェクトが参照しているデータは別々のものなので、一方のオブジェクトのインスタンス変数に変更を加えても、もう一方のオブジェクトには影響を与えません。

まとめ

この違いを知っておかないと、バグの元になるので、コピーをするときは、どちらの方法を使ったのか確認する癖をつけるとよいのではないでしょうか。
いまいち意味が分からない、という人は、C言語のポインタのようなイメージで理解できないでしょうか。
ここでいう「参照」とは、C言語でいうポインタのようなものです。
シャローコピーがポインタのコピーで、ディープコピーが、ポインタの指し示している実体のコピーである。と思えばなんとなくイメージできるかもしれません。