javaを勉強している方であれば一度は「不変なオブジェクト(immutableオブジェクト)」という言葉は聞いたことがあると思います。
単語の意味的に、変化しないのね…と容易に想像できますが、学習を進めていくうちに不変なのに変わってる??不変ってどういうこと?と疑問に思ったため、今回は私なりに不変オブジェクトってなんぞやを解説していきたいと思います。
目次
- 不変オブジェクトとは?
- 単語解説
- 実際にコードを見てみよう
- まとめ
不変なオブジェクトとは?
不変なオブジェクトとは、「データが変化しないオブジェクト」です!!
わかります…横文字嫌い…オブジェクトってなに?おいしいの?って思いますよね…
オブジェクトとは「物体、対象」と訳されます。
つまり、不変なオブジェクトとは「対象のデータが変化しない」ということになります。
単語の意味を理解できたところで実際にコードを見て学習を進めましょう。
単語解説
プログラミング学習をする上で大変なことの一つとして単語の意味が分からないというものがあげられると思いますので、登場する単語の意味を解説いたします。
インスタンス化
インスタンスとは「プログラムの処理に使用できる状態にしたもの」のことを指します。
つまりインスタンス化とは、簡単に言うと「プログラムで使えるようにすること」です。
Javaで変数を使うためには基本的にはインスタンス化が必要ですよね。
String str = new String();
こちらのコードは「str」という変数を使えるようにするためにインスタンス化しております。
実際にコードを見てみよう
今回不変なオブジェクトの解説に当たって、不変なオブジェクトである「String型の変数」と可変なオブジェクトである「StringBuilder型の変数」を使っていきます。
不変なオブジェクト
String A = "不変な"; //又はString A = new String();
String B = A;
B += "オブジェクト";
System.out.println(A);
System.out.println(B);
System.out.println(A == B);
こちらのコードを出力してみると
不変な
不変なオブジェクト
False
と表示されます。
こちらは2行目でAの変数をBの変数に代入しており、3行目でAを代入したBに文字を追加しています。
はじめ私はこの出力結果をみて「え?変わってるじゃん!」って思いました。
もともとBはAと同じ"不変な"というデータを参照していたのに3行目で変更できているし…
ここで「不変って何?」って思いました。
しかし、よくよく調べてみると、実は不変なオブジェクトであるString型の変数は、3行目の時に新しいインスタンスを生成しているため、変更しているのではなく、Aが参照してるデータと新しく追加した文字列を合わせて新しいデータを作成していたのです!
つまり、元のデータ(今回はAが参照している"不変な"という文字列)の変更はされていない!!ということです。
可変なオブジェクト
続いて可変なオブジェクトであるStringBuilder型の変数で作成したコードを見ていきましょう。
StringBuilder A = new StringBuolder("可変な");
StringBuilder B = A;
B.append("オブジェクト");
System.out.println(A);
System.out.println(B);
System.out.println(A == B);
こちらのコードを出力してみると
可変なオブジェクト
可変なオブジェクト
True
と表示されました。
これでなんとなく理解できたのではないでしょうか?
可変なオブジェクトであるStringBuilder型の変数は、2行目でBにAを代入しているときに新しいインスタンスが生成されないため、3行目で変化を与えたときに参照しているデータそのものを変化させてしまいます。
その結果Aが参照しているデータも変更してしまい、結果的にAもBも同じ出力になっています。
まとめ
不変なオブジェクトと可変なオブジェクトを比べることで「不変」とはどういうことなのか理解できたのではないかと思います。
不変なオブジェクトは、データに変化を加える度に新しいインスタンスを作成しており、元のデータはそのまま残っているため、「不変」ということでした。