プロジェクト

全般

プロフィール

操作

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

シャローコピー(参照コピー)とディープコピーの違いを、図解付きのイメージでわかりやすく説明します。


🧠 ざっくり定義

種類 内容
シャローコピー オブジェクトの参照だけをコピー(中身のオブジェクトは共有)
ディープコピー オブジェクトの中の中まで完全に新しく複製するコピー

🔍 具体例(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();

渡邉 拓英 さんが1年以上前に更新 · 0件の履歴