変数の型の不思議

この記事を書いたチーム:frontier
変数の型の不思議

そもそも変数とは?

【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc.  詳細はこちらから>

プログラミング言語の多くには、「変数」と呼ばれる機能が備わっています。
変数とは任意の値の出し入れができるもので、即ち一種の記憶領域になります。

そして変数には「型」というものがあり、その型とは異なる型の値は原則として扱うことができません。型というのは、たとえば数値型や文字列型といったものです。(他にも色々あります)数値型の変数に文字列を入れることはできませんし、その逆も然りです。

プログラミング言語の種類によって細かい仕組みや種類はまちまちだったりしますが、
大抵の言語において共通の概念になります。

本題

JAVAなどのC言語を基礎とするプログラミング言語で変数を使っていて、不思議な事象に遭遇したことはないでしょうか。

数値型の変数と文字列型の変数で、比較や代入などをする際の記述方法が違いますよね。何故でしょうか?

コード①

コード②

 

コード①もコード②もif文で変数が同じかどうかを比較しており、同じであればtrue、異なればfalseを返すコードになっています。
①も②もtrueが返りそうですよね。
もちろん、①のパターンの場合はtrueが返ります。
ところが、②のパターンではtrueではなくfalseが返ってしまいます。

コード③

前述のコード①と上記のコード③は、比較する変数の中身は同じ「1」です。
さてこの場合はどうでしょうか。
もちろん③はfalseが返ります。

上記のコードで比較対象にしているのは、①は数値型(int)、②と③は文字列型(String)です。この型にとある秘密があって、その影響によって上記のコード①とコード②③での違いが発生しています。

プリミティブ型と参照型

実は、変数には大きく分けて2つの種類があります。
1つはプリミティブ型とよばれるもので、もう1つが参照型というもの。

前述の例で使用した数値型はプリミティブ型で、文字列型は参照型になります。

プリミティブ型は基本型とも呼ばれ、その言語が基本機能として持っているタイプの変数です。参照型はクラス(入れ物)を定義して場所情報(アドレス)を保持し、オブジェクトを生成することによって使用するタイプの変数です。

参照型は上記の通り保持しているのはあくまで場所情報です。
コード②や③で文字列型の変数の宣言をした箇所では、実は場所の確保をして場所情報を格納しています。変数aと変数bは、中身の値は同じでもそれぞれ宣言時に全く別の場所を確保してるのです。

ということは…
if文での比較は「変数aの場所と変数bの場所は同じか?」という意味になりますから、falseが返るのは当然ということになるわけです。

※ プログラミング言語によっては、参照型に属する変数でもプリミティブ型と同様の比較演算子で比較できるものもあります。

参照型の値の中身を比較する書き方の正体

文字列型の変数の中身の値を比較する場合は、正しくは以下のように書きます。

コード④

 

上記のように書けば、trueが返ります。

Stringクラスは「equals」というメソッドが用意されており、これを使えばオブジェクトの中身の値同士を比較できるように作られています。
そう、その正体はメソッドなのです。演算子ではないんですね。

【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>

Smallitのサービス