配列やオブジェクトをコピーするときに、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
ポイント
-
shallowCopy
とoriginal
は同じオブジェクトを共有しています。 - コピー先で変更を加えると、元の配列にも影響があります。
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
ポイント
-
deepCopy
はoriginal
とは独立した新しいオブジェクトを持ちます。 - コピー先を変更しても、元の配列には影響がありません。
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を使い分けられるようになりましょう!コードの使い方や実装について気になる点があればコメントで教えてください!