ディープコピー(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
この記事は役に立ちましたか?