プログラム

シャローコピー(shallow copy)とは

2019年12月12日

シャローコピー(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