Javaのインスタンスのコピーについて現役エンジニアが解説【初心者向け】
初心者向けにJavaのインスタンスのコピーについて解説しています。インスタンスのコピーには浅いコピーと呼ばれるもの、深いコピーと呼ばれるものの2つがあります。それぞれの違いと書き方、使用例を見ていきましょう。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
Javaのインスタンスのコピーについて、TechAcademyのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。
Javaについてそもそもよく分からないという方は、Javaとは何なのか解説した記事を読むとさらに理解が深まるでしょう。
なお本記事は、TechAcademyのオンラインブートキャンプ、Java講座の内容をもとに作成しています。
今回は、Javaに関する内容だね!
どういう内容でしょうか?
インスタンスのコピーについて詳しく説明していくね!
お願いします!
目次
インスタンスとは
インスタンスとは、クラスをから生成されるオブジェクトのことです。
また、クラスをもとにオブジェクトを生成することをインスタンス化と呼び、インスタンスを生成するとメモリ上のインスタンスが作られた場所を示す参照が作られます。
[PR] Javaプログラミングで挫折しない学習方法を動画で公開中
浅いコピーと深いコピーの違い
インスタンスをコピーする場合、浅いコピーと深いコピー2つの方法があります。
浅いコピーは、インスタンス自体はコピーされて別のインスタンス扱いになっているものの、中のメンバ変数の参照先が変わっていないコピー方法のことです。
この方法でコピーすると、インスタンスのメンバ変数を変更した場合、もう一方のインスタンスのメンバ変数も同時に変更される点に注意しましょう。
対して、深いコピーはメンバ変数の参照先の実体も含めてコピーされます。
別々のメモリ上のオブジェクトの実体を見に行くようにコピーするため、一方のインスタンスの値を変更しても、もう一方のインスタンスの値には影響なく変更可能です。
深いコピーを実現するには以下のようにクラスを記述しておきましょう。
class クラス名 implements Cloneable{ 参照型 メンバ変数01; プリミティブ型 メンバ変数02; public Object clone(){ try{ クラス名 変数名=(クラス名)super.clone(); 変数名.メンバ変数 = new 参照型(メンバ変数01); return変数名; }catch(CloneNotSupportedException ex){ return null; } } }
コピーするときは以下のように記述しましょう。
クラス名 コピー前 = new クラス名(); クラス名 コピー後 = コピー前.clone();
作成したcloneメソッドを使うことでコピーを実現可能です。
実際に書いてみよう
Javaのインスタンスの浅いコピーと深いコピーを実際にソースで書いてみましょう。
ソースコード
public class SampleClass { public static void main(String[] args) { System.out.println("==浅いコピー=="); Sample01 sample01 = new Sample01(); sample01.str = new StringBuffer("あいうえお"); Sample01 sample02 = (Sample01) sample01.clone(); sample02.str.append("かきくけこ"); System.out.println(sample01.str); System.out.println(sample02.str); System.out.println("==深いコピー=="); Sample02 sample03 = new Sample02(); sample03.str = new StringBuffer("あいうえお"); Sample02 sample04 = (Sample02) sample03.clone(); sample04.str.append("かきくけこ"); System.out.println(sample03.str); System.out.println(sample04.str); } } class Sample01 implements Cloneable { StringBuffer str; public Object clone() { try { Sample01 sample=(Sample01)super.clone(); return sample; } catch(CloneNotSupportedException ex) { return null; } } } class Sample02 implements Cloneable{ StringBuffer str; public Object clone() { try { Sample02 sample=(Sample02)super.clone(); sample.str = new StringBuffer(str); return sample; }catch(CloneNotSupportedException ex){ return null; } } }
実行結果
==浅いコピー== あいうえおかきくけこ あいうえおかきくけこ ==深いコピー== あいうえお あいうえおかきくけこ
浅いコピーではインスタンスの実体はコピーされたものの、中の参照型のメンバ変数の参照先はそのままなので、コピー先のインスタンスのメンバ変数を変更するとコピー元のメンバ変数も変わっています。
一方、深いコピーでは、参照型のメンバ変数の参照先も含めてコピーしているため、コピー先のインスタンスのメンバ変数を変更してもコピー元のメンバ変数は変わりません。
コスパとタイパ、両方結果的に良くなる良くなる学び方とは?
「スクールは高いし時間も縛られて効率が悪い」と考える方は多いと思います。
もちろん、時間も費用もかかることは間違いありません。
ただ
結果的に無駄な学びにお金も時間もかける方がリスクが高いという考えもあります。
コスパ・タイパ最適化の参考として、
テックアカデミー卒業生がスクールを選んだ理由
をご紹介します。
- ・困ったときに、質問や相談できる相手がいるため挫折しなかった
- ・プロとして必要なスキルのみを深く学べたので無駄がなかった
- ・副業案件の提供と納品までのサポートがあったので目的を達成できた
安価・短期間で広く浅く学んでも意味がありません。
本当に自分の目的が達成できるか、それが重要です。
自分にどのスキルや学び方が合っているか、どんな学習方法かなど、お気軽に
無料相談
に参加してみませんか?
カウンセラー・現役のプロへ、何でも気軽に無料相談可能。
30分か60分お好きな時間が選べて、かつ3回まで
すべて無料で
ご利用できます。
無理な勧誘は一切ない
ので、お気軽にご参加ください。
まとめ
この記事ではJavaのインスタンスの浅いコピーと深いコピーについて解説しました。
執筆してくれたメンター
メンターSさん
システムエンジニアとしてこれまで行政システムや医療用システムの保守、開発に携わりました。 JavaやPython、PHP、Kotlinなど様々な言語での開発経験があります。 TechAcademyではJavaコース、Pythonコース、AIコースなど7コースを担当しています。 |
Javaのインスタンスのコピーがよく分かったので良かったです!
ゆかりちゃん、これからも分からないことがあったら質問してね!
分かりました。ありがとうございます!
TechAcademyでは、初心者でも、JavaやServletの技術を使ってWebアプリケーション開発を習得できるオンラインブートキャンプを開催しています。
また、現役エンジニアから学べる無料体験も実施しているので、ぜひ参加してみてください。
プログラミングを独学で学習していて、このように感じた経験はないでしょうか?
- ・調べてもほしい情報が見つからない
- ・独学のスキルが実際の業務で通用するのか不安
- ・目標への学習プランがわからず、迷子になりそう
テックアカデミーでは、このような
学習に不安を抱えている方へ、マンツーマンで相談できる機会を無料で提供
しています。
30分間、オンラインでどんなことでも質問し放題です。
「受けてよかった」と感じていただけるよう
カウンセラーやエンジニア・デザイナー
があなたの相談に真摯に向き合います。
「自分に合っているか診断してほしい」
「漠然としているが話を聞いてみたい」
こんなささいな悩みでも大丈夫です。
無理な勧誘は一切ありません
ので、まずはお気軽にご参加ください。
※体験用のカリキュラムも無料で配布いたします。(1週間限定)