シャローコピー(shallow copy)とは
シャローコピー(shallow copy)とは浅い(shallow)コピーと呼ばれ、コピー元オブジェクトから、同じ実体(データ)を参照する別オブジェクトを生成する方式です。
オブジェクト(データを格納する箱※Beanクラス)はメモリ上にある実体(データ)を参照しています。
このオブジェクトに対して「シャローコピー」を行うと、コピーされたもう一つの「コピー先オブジェクト」が生成されます。
見た目は2つのオブジェクトが存在するように見えますが、実際は「コピー元オブジェクト」と「コピー先オブジェクト」はメモリ上にある同じ実体(データ)を参照しているのです。これが「シャローコピー」です。
メモリ上にある同じ実体(データ)を参照しているので、どちらかのオブジェクトを変更したら、もう片方のオブジェクトも変更されます。なぜなら同じ実体(データ)を参照しているからです。
スポンサーリンク
シャローコピーの具体例
オブジェクト(データを入れる箱)
以下のクラスが存在するとします。
package entity; public class User { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
シャローコピーの実行例
package main; import entity.User; public class Start { public static void main(String[] args) { User user1 = new User(); // user1の名前を設定 user1.setName("名前1"); // シャローコピー User user2 = user1; // user2の名前を変更 user2.setName("変更したよ"); System.out.println("user1の名前:" + user1.getName()); System.out.println("user2の名前:" + user2.getName()); } }
上記の例では「user1」のオブジェクトを「user2」に「シャローコピー」しています。
そして「user1」と「user2」のnameフィールドには以下の値を設定。
- 「user1」のnameフィールドに"名前1"を設定
- 「user2」のnameフィールドに"変更したよ"を設定
しかし実行結果は
user1の名前:変更したよ user2の名前:変更したよ
「user1」と「user2」のnameフィールドにはどちらも"変更したよ"が設定されています。
これは「user2」と「user1」のオブジェクトは、メモリ上にある同じ実体(データ)を参照しているからです。
見た目上は2つあるように見えるオブジェクトですが、実体は1つなのです。このように「シャローコピー」は、まるで忍者の"分身の術"(複数人に見えるが本体は1つ)のようなコピー方式です。
helpful
この記事は役に立ちましたか?