C言語上がりのプログラマならJavaでシャローコピー(浅いコピー、Shallow Copy)、ディープコピー(深いコピー、Deep Copy)と言われて、説明を受ければ納得できると思います。
一方、初めてJavaでプログラムを覚える人にとっては、シャローコピーとディープコピーはなかなか分かりにく概念です。
目次
シャローコピー(浅いコピー、Shallow Copy)
シャローコピーとは、文字通り浅いコピーです。
参照はコピーされますが、実体はコピーされません。
実体が変更されるとコピー元から見てもコピー先から見ても内容が変更されています。
JavaのObject#clone()はシャローコピーです。
ディープコピー(深いコピー、Deep Copy)
ディープコピーは深いコピーです。
ディープコピーでは実体もコピーされます。
Javaでは、ディープコピーはclone()メソッドをオーバーライドして自分で実装しないといけません。
C++のSTL(Standard Template Library、標準テンプレートライブラリ)でもシャローコピー、ディープコピーがある
ポインタを持たない言語であるJavaに比べるとポインタを持つ言語であるC++ではシャローコピーとディープコピーの概念は比較的に容易です。
1 2 3 4 5 |
std::vector<Hoge> h; std::vector<Hoge> cp = h; // Deep Copy std::vector<Hoge*> h; std::vector<Hoge*> cp = h; // Shallow Copy |
基本、ポインター変数をコピーするとシャローコピー、ポインターなし変数をコピーするとディープコピーと覚えましょう。
プログラミングの無料レッスン体験
約8,000名の受講生と80社以上の導入実績のあるプログラミングやWebデザインのオンラインマンツーマンレッスンCodecamp
<Codecampの特徴>
1 現役エンジニアによる指導
2オンラインでのマンツーマン形式の講義
3大手企業にも導入されている実践的なカリキュラム
↓無料体験レッスン実施中です。
コメント
[…] 実体が変更されるとコピー元から見てもコピー先から見ても内容が変更されています。 C言語上がりのプログラマならJavaでシャローコピー(浅いコピー、Shallow Copy)、ディープコピー(深いコピー、Deep Copy)と言われても納得できると思います。 初めてJavaでプログラムを覚えるとシャローコピーとディープコピーはなかなか分かりにく概念です。 [紹介元] シャローコピー(浅いコピー、Shallow Copy)とディープコピー(深いコピー、Deep… […]