Java

【Java】イミュータブルってなに?図を使ってわかりやすく解説

※当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

コード

ひでまる
ひでまる
こんにちは!ひでまるです!
今回はJavaのイミュータブルについて解説していきます

 

JavaSilverの資格を取ったのですが、勉強していく中でイミュータブルとかイメージするの大変だったな…
と思うことが多かったので「他の方も同じ人いるかもしれない」と思い記事として残します

 

イメージできる事を目標としていますので、細かい部分は調べてみてくださいね

では早速行きましょう!

こんな方におすすめ

  • イミュータブルをなんとなく理解している人
  • イミュータブルをイメージできるようになりたい人

 

 

イミュータブルってなに?

質問

イミュータブルとは「不変」という意味です。反対に変更できるものは、ミュータブルと呼ばれます。

 

まてまて、不変て何??なにが不変なの??
意味わからないですよね…私も意味わかりませんでした笑

 

Javaではイミュータブルとして有名な「Stirngクラス」があります。
なのでStringクラスを使った、簡単な下記のコードで見ていきましょう。

String str = "これはイミュータブルです";

こちらのコードは、String型のstrというローカル変数にStringクラスのインスタンス「これはイミュータブルです」という文字列を代入しています。

 

String str = "これはイミュータブルです";
System.out.println(str);
=>これはイミュータブルです

なので、strを出力すれば「これはイミュータブルです」という文字列が表示されますよね。

 

 

あちゃー

「これはイミュータブルです」のあとに「!」を付けるのを忘れてしまいました。

「これはイミュータブルです!」という文字にしたかったので、代入し直します。

String str = "これはイミュータブルです";
 str = "これはイミュータブルです!";

strというローカル変数に「これはイミュータブルです!」という文字列を代入し直しました。

 

はい!ここでストップです!

strに「これはイミュータブルです!」が上書きされたと思った方いませんか??
これ実は上書きされていないんです。

 

Stringクラスはイミュータブルなので一度作ったインスタンスは不変です。
つまり変わっていないのです!

 

え?ちょいちょいちょい、str出力してみてよ

System.out.println(str);
⇒ これはイミュータブルです!

いや、ちゃんとstrの中身に「これはイミュータブルです!」入っているじゃん!

 

そうなんです。ちゃんと出力されますよね。
この謎を解くためには、メモリの使われ方を知る必要があります。

 

なので、次はメモリの使われ方を見ていきましょう!

 

メモリを知って、イミュータブルを理解する

 

メモリ

メモリとは主記憶装置の事です。
ざっくり言うと、プログラムはメモリに置かれ、プログラムを動かすときはメモリの領域を使いながら処理していきます。

 

メモリの中にはヒープ領域、スタック領域というのが存在します。

ヒープ領域は、アプリケーションの要求によって確保される領域で、インスタンスなどが入ります。

スタック領域は、一時的な記憶領域で、メソッドやローカル変数などが置かれます。

 

String str = "これはイミュータブルです";

こちらのコードでは、Stringクラスのインスタンスなので、メモリ領域の使い方はどうなっているのか?というと、

ヒープ領域に「これはイミュータブルです」というインスタンスが入ります。スタック領域にはローカル変数が入るのでstrはスタック領域に置かれます

 

じゃあスタック領域のstrにはなにが入っているのか?

「これはイミュータブルです、の場所はヒープ領域のここですよ」という場所を示すポインタが入ります。

 

図で表すとこんなイメージです。

これはイミュータブルです

 

 

str = "これはイミュータブルです!";

ではstrを新しい文字で書き直してみると、

メモリ内部では、「これはイミュータブルです!」という新しいインスタンスがつくられ

strには「これはイミュータブルです!」の場所を示すポインタが入ります。

これはイミュータブルです!

なので、メモリの中には「これはイミュータブルです」というインスタンスは残っているんですね。

これがイミュータブル「不変」という事です。

 

まとめると

String str = "これはイミュータブルです";
str = "これはイミュータブルです!";

こちらのコードは上書きされるのではなく、

  • これはイミュータブルです
  • これはイミュータブルです!

どちらのインスタンスもメモリの中に作られ、strが示すポインタだけ変わるということになります。

 

Stringクラスには、コンスタントプールがあり「一度使われたインスタンスは再度使われる」という機能があります。
今回は、イメージのため説明を省いていますが、興味がある方は調べて見てくださいね。

 

少し話は逸れますが、「独学つらい…」と思う人はプログラミングスクールもオススメです!
【必ず見つかる】あなたのニーズに合った最適なプログラミングスクール4選

 

最後に

今回はイミュータブルについて解説しました。
イミュータブルはなかなかイメージしにくいので、少しでも「イメージできた!」という方がいたら嬉しいです。

最後に少し本の紹介です!
Javaを勉強するなら「スッキリわかるJava入門」は、めちゃめちゃ分かりやすいです。
私の周りでJavaやっている人は、みんな持っているのでオススメです!

スッキリわかるJava入門

 

読んでいただきありがとうございました!

-Java