シャローコピー、ディープコピー¶
シャローコピー(参照コピー)とディープコピーの違いを、図解付きのイメージでわかりやすく説明します。
🧠 ざっくり定義¶
| 種類 | 内容 |
|---|---|
| シャローコピー | オブジェクトの参照だけをコピー(中身のオブジェクトは共有) |
| ディープコピー | オブジェクトの中の中まで完全に新しく複製するコピー |
🔍 具体例(Java風)¶
Department dept = new Department("営業部");
Employee emp1 = new Employee("田中", dept);
// シャローコピー(参照だけコピー)
Employee emp2 = emp1;
// ディープコピー(中身も新規にコピー)
Employee emp3 = emp1.deepCopy();
🔧 メモリ上のイメージ¶
🧪 シャローコピー(参照コピー)¶
emp1 ─┬──────────┐
│ ↓
│ +------------+
│ | name: 田中 |
│ | dept: ─────┼─────┐
│ +------------+ ↓
│ +------------+
emp2 ───────────────────────>| name: 営業部 |
+------------+
-
emp1とemp2は 同じインスタンス。 -
emp1.getDepartment() == emp2.getDepartment()→true
🧪 ディープコピー¶
emp1 ─┬──────────┐
│ ↓
│ +------------+ emp3 ─┬──────────┐
│ | name: 田中 | │ ↓
│ | dept: ─────┼─────┐ │ +------------+
│ +------------+ ↓ │ | name: 田中 |
│ +------------+ | dept: ─────┼─────┐
│ | name: 営業部 | +------------+ ↓
│ +------------+ +------------+
| name: 営業部 |
+------------+
-
emp3は 完全な新規インスタンス -
emp3.getDepartment()も別オブジェクト -
emp1 != emp3、emp1.getDepartment() != emp3.getDepartment()→true
📌 違いまとめ¶
| 比較項目 | シャローコピー | ディープコピー |
|---|---|---|
| 参照(ポインタ) | 同じ参照 | 別のインスタンス |
| メモリ効率 | 良い(軽い) | 重い(コピーにコスト) |
| 副作用の有無 | あり(片方変更でもう片方も影響) | なし(完全に独立) |
| 実装の手間 | 簡単(代入やclone) | やや複雑(シリアライズや手動コピー) |
🧰 用途・使い分け¶
| シャローコピーを使う場面 | ディープコピーを使う場面 |
|---|---|
| パフォーマンス優先の一時処理 | 安全にデータを分離したい場合 |
| 不変オブジェクトを扱う場合 | 編集・変更が必要な場合 |
| 状態を共有したいとき | 状態を切り離したいとき |
💬 まとめ¶
シャローコピーは「コピーしてるようで実は同じものを見ている」
ディープコピーは「そっくりだけど完全に別人を作っている」
// 『バッチ2・3間ログの退避』
// 変数.バッチ23間ログ保管用[W23BAR_BACK] ← プロパティ.バッチ23間ログ[W23BAR] 全項目をコピーする
batchBetweenLog23Storing = batchBetweenLog23;
↓
// 『バッチ2・3間ログの退避』
// 変数.バッチ23間ログ保管用[W23BAR_BACK] ← プロパティ.バッチ23間ログ[W23BAR] 全項目をコピーする
batchBetweenLog23Storing = batchBetweenLog23.deepCopy();