0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Shallow CopyとDeep Copyの違いを徹底解説【Java編】

Posted at

配列やオブジェクトをコピーするときに、Shallow Copy(浅いコピー)Deep Copy(深いコピー) の違いをしっかり理解しておくことは、プログラミングでとても重要です。この記事では、その違いをわかりやすくコード付きで解説します。


Shallow Copy(浅いコピー)とは?

Shallow Copy は、配列やオブジェクトの「参照」をコピーします。これにより、コピー元とコピー先は同じインスタンスを共有します。そのため、どちらかを変更すると、もう一方にも影響が及びます。

Shallow Copyの例

class Person {
    String name;

    Person(String name) {
        this.name = name;
    }
}

public class ShallowCopyExample {
    public static void main(String[] args) {
        // 元の配列
        Person[] original = {new Person("Alice"), new Person("Bob")};

        // Shallow Copy: 参照をそのままコピー
        Person[] shallowCopy = new Person[original.length];
        for (int i = 0; i < original.length; i++) {
            shallowCopy[i] = original[i]; // 同じオブジェクトを参照
        }

        // コピーを変更
        shallowCopy[0].name = "Eve";

        // 結果確認
        System.out.println("Original: " + original[0].name);  // "Eve"(元も影響を受ける)
        System.out.println("Shallow Copy: " + shallowCopy[0].name);  // "Eve"
    }
}

結果

Original: Eve
Shallow Copy: Eve

ポイント

  • shallowCopyoriginal は同じオブジェクトを共有しています。
  • コピー先で変更を加えると、元の配列にも影響があります。

Deep Copy(深いコピー)とは?

Deep Copy は、配列やオブジェクトの中身をすべて新しく複製します。これにより、コピー元とコピー先は完全に独立した状態になります。どちらかを変更しても、もう一方に影響は及びません。

Deep Copyの例

class Person {
    String name;

    Person(String name) {
        this.name = name;
    }

    // Deep Copyを作るためのメソッド
    public Person deepCopy() {
        return new Person(this.name);
    }
}

public class DeepCopyExample {
    public static void main(String[] args) {
        // 元の配列
        Person[] original = {new Person("Alice"), new Person("Bob")};

        // Deep Copy: 新しいオブジェクトを作成
        Person[] deepCopy = new Person[original.length];
        for (int i = 0; i < original.length; i++) {
            deepCopy[i] = original[i].deepCopy(); // 新しいオブジェクトを作成
        }

        // コピーを変更
        deepCopy[0].name = "Eve";

        // 結果確認
        System.out.println("Original: " + original[0].name);  // "Alice"(元は影響を受けない)
        System.out.println("Deep Copy: " + deepCopy[0].name);  // "Eve"
    }
}

結果

Original: Alice
Deep Copy: Eve

ポイント

  • deepCopyoriginal とは独立した新しいオブジェクトを持ちます。
  • コピー先を変更しても、元の配列には影響がありません。

Shallow Copy と Deep Copy の違いまとめ

項目 Shallow Copy Deep Copy
コピー内容 配列やオブジェクトの「参照」をコピー 配列やオブジェクトの「中身」をコピー
変更の影響 元のデータとコピー先が影響を及ぼす 元のデータとコピー先は独立している
コードの違い shallowCopy[i] = original[i]; deepCopy[i] = original[i].deepCopy();

どちらを使うべきか?

  • Shallow Copy:
    • メモリを節約したい場合
    • 元のオブジェクトとコピー先で同じ参照を共有するのが意図的な場合
  • Deep Copy:
    • コピー元とコピー先を完全に独立させたい場合
    • データを変更しても他方に影響を与えたくない場合

この記事を参考に、Shallow CopyとDeep Copyを使い分けられるようになりましょう!コードの使い方や実装について気になる点があればコメントで教えてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?