シャローコピー(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つ)のようなコピー方式です。