プログラム

ディープコピー(deep copy)とは

ディープコピー(deep copy)とは

ディープコピー(deep copy)とは深い(deep)コピーと呼ばれ、コピー元オブジェクトから実体(データ)を複製し別オブジェクトを生成する方式です。

オブジェクト(データを格納する箱※Beanクラス)はメモリ上にある実体(データ)を参照しています。
オブジェクトの生成

このオブジェクトに対して「ディープコピー」を行うと、コピーされたもう一つの「コピー先オブジェクト」が生成されます。

この時、メモリ上にある実体(データ)もコピーされます。これが「ディープコピー」です。

ディープコピー

「ディープコピー」で作られた2つのオブジェクトは、まったく別の実体(データ)を参照しているため、どちらかのオブジェクトを変更しても、もう片方のオブジェクトには影響を与えません

スポンサーリンク

ディープコピーの具体例

オブジェクト(データを入れる箱)

以下のクラスが存在するとします。Javaが提供しているclone(複製)を作るインタフェースである「Cloneable」をimplements しています。

package entity;

public class User2 implements Cloneable {

  private String name;

  @Override
    public User2 clone() {
    User2 user2 = null;
        try {
        	user2 = (User2) super.clone();

    } catch (CloneNotSupportedException e) {
      e.printStackTrace();
    }

        return user2;
    }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

ディープコピーの実行例

package main;

import entity.User2;

public class Start2 {

  public static void main(String[] args) {

    User2 user2 = new User2();
    // user1の名前を設定
    user2.setName("変更前の名前");

    // ディープコピー
    User2 copyUser2 = user2.clone();
    // user2の名前を変更
    copyUser2.setName("変更後の名前");

    System.out.println("コピー元の名前:" + user2.getName());
    System.out.println("コピー先の名前:" + copyUser2.getName());
  }
}

上記の例では「user2」のオブジェクトを「copyUser2 」にディープコピーしています。

「user2」と「copyUser2 」のnameフィールドには以下の値を設定。

  • 「user2」のnameフィールドに"変更名前の名前"を設定
  • 「copyUser2 」のnameフィールドに"変更後の名前"を設定

 

そして実行結果は以下です。

コピー元の名前:変更前の名前
コピー先の名前:変更後の名前

ディープコピーはシャローコピーとは違い、オブジェクトだけでなく、実体(データ)もコピーする完全なコピーのため、どちらかのオブジェクトを変更しても、もう片方のオブジェクトには影響を与えません。

helpful