😙

Javaのプリミティブ型についてざっくりまとめてみた[Java初心者]

に公開

はじめに

こんにちは。
プログラミング初心者Wakinozaと申します。
Java勉強中に調べたことを記事にまとめています。

十分気をつけて執筆していますが、なにぶん初心者が書いた記事なので、理解が浅い点などあるかと思います。
記事を参考にされる方は、初心者の記事であることを念頭において、お読みいただけると幸いです。
間違い等あれば、指摘いただけると助かります。

対象読者

  • Java勉強中の方。
  • Java SE Bronze試験を勉強中の方。
  • Javaのプリミティブ型とvarについてざっくり知りたい方。

目次

1. データ型とは
2. Javaのデータ型
3. プリミティブ型
4. 型推論のvar

本文

1. データ型とは

そもそも、どうしてデータ型が必要なのでしょうか。

私たちはコンピュータ上で、整数・小数・文字・真偽値など多種のデータを扱っています。これらのデータは、コンピュータの内部で全て2進数のビットパターンに変換されています。とはいえ、すべてのデータが同じサイズ、同じ規則で変換されているわけではありません。必要なメモリサイズも、ビットパターンの解釈方法も、それぞれのデータに最適な仕様になっています。ところが、データごとにメモリサイズや解釈方法が違うことによって困ったことが起きます。格納したデータを取り出す際に、データのサイズや解釈方法を間違えると、見当違いのデータとなってしまうのです。

データを格納する度に、「このデータはどんなサイズ」で、「ビットパターンをどう解釈すべきか」をいちいち人間が記憶するのは、非効率です。そこで、データサイズと解釈方法をコンピュータに記憶させようと導入されたシステムが、「データ型」です。

データを格納する際に「データ型」を宣言することで、コンピュータは必要なサイズのメモリを自動で確保し、ビットパターンをどう解釈すれば良いのかという情報も一緒に記録します。
「データ型」のおかげで、人間は、格納されたデータのサイズや解釈方法を覚えている必要がなくなったのです。

2. Javaのデータ型

Javaのデータ型は、大きく分けると2つの種類、「プリミティブ型」と「参照型」に分けられます。

プリミティブ型は「基本データ型」とも呼ばれ、「数値型」(「整数型」と「浮動小数点数型」)、「文字型」、「真偽値型」などがあります。変数にデータそのものが格納されているのが特徴です。

参照型は、「配列型」「オブジェクト型」「列挙型」などがあります。変数に、データが保存されているアドレスへの参照が格納されているのが特徴です。

今回は、「プリミティブ型」について取り上げていきます。

3. プリミティブ型

代表的な8つのデータ型は以下の通りです。

データ型名 格納するデータ 格納可能な範囲 サイズ
byte とても小さな整数 -128 ~ 127 8ビット
short 小さな整数 -32768 ~ 32767 16ビット
int 普通の整数 -2147483648 ~ 2147483647 32ビット
long 大きな整数 -9223372036854775808 ~ 9223372036854775807 64ビット
float 小さくて曖昧な少数 符号付き浮動小数点数 32ビット
double 普通の少数 符号付き浮動小数点数 64ビット
boolean trueかfalse
char 1文字 16ビット

プリミティブ型は、「数値型」「真偽値型」「文字型」に分類されます。数値型はさらに、「整数型」と「浮動小数点数型」に分類されます。

整数型

整数型には、byte型、short型、int型、long型という、4つの型があり、それぞれ必要なメモリサイズと格納可能なデータ範囲が決まっています。
基本的にはint型を使います。

byte型とshort型は、メモリリソースに制限がある場合などに用いられます。
long型は、時刻をミリ秒単位で取得する場合など、桁数の多い整数を扱う一部のシステムで用いられています。

浮動小数点数型

小数を扱う「浮動小数点数型」には、float型とdouble型があります。
float型よりdouble型の方が精度が高いため、特別な理由がない限りdouble型を使用します。

注意が必要なのは、float型もdouble型も、真に厳密な計算はできないという点です。これは、10進数の少数を2進数に変換した際に、桁が無限に続く無限小数になってしまうことが原因です。64ビットのdouble型でも無限に続く桁は保持できないため、どこかで桁を切り捨て、近似値に丸める必要があります。この際に生じた、無限小数と近似値の差を「丸め誤差」と言います。丸め誤差は極々小さい誤差ですが、計算を繰り返すうちに大きな誤差に膨れ上がる場合もあります。
丸め誤差は、浮動小数点数方式を扱う際に避けて通れないものです。float型やdouble型を扱う際は、厳密な計算はできない点を常に意識しなければなりません。

なお、Javaで金額の計算など誤差が許されない計算を行う用に、BigDecimal型などのクラスが用意されています。

真偽値型

boolean型は「論理型」とも呼ばれ、YesかNoかといった二者択一の情報を格納するために用意されたデータ型です。
条件に合致している場合は「true」を、条件に合致していない場合は「false」を格納します。

「どちらでもない」といった曖昧な情報は、boolean型には格納できません。

文字型

char型は、全角/半角を問わず1文字分のデータを格納できます。

文字を指定する方法は、シングルクォーテーション「'」で文字を囲む方法と、整数値を入力する方法と2種類あります。
文字型なのに整数値を入力できる理由は、Javaのchar型が内部的にはUnicodeという文字コードで管理されているからです。Unicodeとは、文字の国際的な標準規格です。0~65535の整数に、世界各国の言語の文字が割り当てられています。

ちょっと実験してみましょう。
以下のコードをご覧ください。
①で、char型の変数c1に、'あ'を格納します。シンプルに'あ'をシングルクォーテーションで囲んでいます。結果①を見ると、ちゃんと'あ'と表示されています。
②で、c1をint型にキャストします。 これによって、c1変数に格納されている16進数の文字コードが10進数に変換され、変数iに格納されます。結果②を見ると、12354という整数が表示されています。
③で、上の②の結果をchar型変数c2に格納します。結果③を見ると、整数12354を格納したのに文字の'あ'が表示されています。

char c1 = 'あ'; //①
System.out.println(c1); //①結果:あ

int i = (int)c1; //②
System.out.println(i); //②結果:12354

char c2 = 12354; //③
System.out.println(c2); //③結果:あ

以上の実験から、文字コードの整数を格納しても、char型の文字が表示できることがわかりました。
ちなみにchar型を用いて、整数の計算や型変換をすることも可能です。ですが、基本的にはchar型は文字のデータ型と考えた方が良いと思います。

4. 型推論のvar

Java10以降、プリミティブ型の代わりにvarというキーワードを利用できるようになりました。変数宣言する際にデータ型の代わりにvarと入力すると、型の指定を簡略化することができます。varは、代入された値からコンパイラが自動的にデータ型を推論するという機能で、「型推論」と呼ばれます。
以下のコードが、varの例です。

var x = 123;    //xはint型と推論されます
var y = 123.45; //yはdoubleと推論されます
var z = 'a';    //zはchar型と推論されます
var list = new ArrayList<String>(); // listはArrayList<String>と推論されます
ArrayList<String> list = new ArrayList<String>();  //varを使わないコレクションの宣言

長くなりがちなコレクションの宣言も、varを使うとシンプルに書くことができます。

注意が必要なのは、varを記述した時点で変数の型が明確でなければエラーになってしまうという点です。
例えば以下のコードはエラーになります。

var x; //値が格納されていないのでエラー
var y = null; //nullを格納しているのでエラー
var arr = {10,20,30}; //型を省略した配列の宣言はできないのでエラー

また型推論は、ローカル変数でのみ使える機能です。引数や戻り値、フィールド変数にはvarを用いることはできません。


記事は以上です。
次回は、型変換についてまとめた記事を書く予定です。

最後までお読みいただき、ありがとうございました。

参考文献

この記事は以下の情報を参考にして執筆しました。

Discussion