Javaプログラミング入門
4. データ型
最終更新:
javatutorial
-
view
データ型とは
Javaでは、プログラムの中でさまざまな種類のデータを扱うことができます。
そのデータの種類のことをデータ型、または単に型といいます。
Javaが扱うデータの具体例として、数値や文字、文字列といったデータが存在します。
こうしたデータは、それぞれ特定の「型」に分類されており、どのように扱うかが決まっています。
そのデータの種類のことをデータ型、または単に型といいます。
Javaが扱うデータの具体例として、数値や文字、文字列といったデータが存在します。
こうしたデータは、それぞれ特定の「型」に分類されており、どのように扱うかが決まっています。
主な型には、次のようなものがあります。
整数値(int, long など):小さな数から大きな数までを扱います。
小数値(float, double):小数点を含む数値を扱います。
文字(char):1文字(例:'A' や '9')を表します。
文字列(String):複数の文字を組み合わせた文字列を扱います。
真偽値(boolean):true(真)または false(偽)のどちらかを持つデータです。
小数値(float, double):小数点を含む数値を扱います。
文字(char):1文字(例:'A' や '9')を表します。
文字列(String):複数の文字を組み合わせた文字列を扱います。
真偽値(boolean):true(真)または false(偽)のどちらかを持つデータです。
Javaでは、どんな種類のデータを扱うかを事前に決めておくことで、効率的にプログラムを動かすことができます。
データ型は基本型と参照型に大きく分けることができます。
以下がJavaが扱うことができるデータ型の一覧になります。
| データ型 | 基本型 | 論理型 | boolean | true(真)または false(偽)の2つの値を持ちます boolean 型はプログラムの意思決定を行う重要なデータ型です |
|---|---|---|---|---|
| 整数型 | byte | Javaの整数型の中で最も小さいデータ型です 8ビット(1バイト) のサイズを持ちます -128から127の範囲を表現できます | ||
| short | Javaの整数型の中で2番目に小さいデータ型です 16ビット(2バイト) のサイズを持ちます -32,768から32,767の範囲を表現できます | |||
| int | Javaで最もよく使われる整数型です 32ビット(4バイト) のサイズを持ちます -2,147,483,648から2,147,483,647の範囲を表現できます | |||
| long | Javaの基本型で最も大きな範囲の整数を扱うことができるデータ型です 64ビット(8バイト) のサイズを持ちます -9,223,372,036,854,775,808から9,223,372,036,854,775,807の範囲を表現できます | |||
| 浮動小数点型 | float | 小数を扱うためのデータ型です 約7桁の小数値を表現することができます(32ビット(4バイト)のサイズを持ちます) ±1.4 × 10⁻⁴⁵ ~ ±3.4 × 10³⁸の範囲を表現できます(例:3.1415927) | ||
| double | 小数を扱うためのデータ型です 約15桁の小数値を表現することができます(64ビット(8バイト)のサイズを持ちます) ±4.9 × 10⁻³²⁴ ~ ±1.8 × 10³⁰⁸の範囲を表現できます(例:3.141592653589793) | |||
| 文字型 | char | 1つの文字(単一の文字)を表すデータ型です 16ビット(2バイト)のUnicode文字を扱うことができます。 | ||
| 参照型 | 文字列型 | String | 文字列(複数の文字の並び)を扱うためのデータ型です |
リテラル
プログラム内で命令文と値を識別するために定められた記述方法のことをいいます。
簡単に言うと、プログラムの中で 直接記述するデータや値のことを リテラルといいます。
簡単に言うと、プログラムの中で 直接記述するデータや値のことを リテラルといいます。
リテラルの考え方
次の2つの「0」を見てください。
0 0
どちらも 「0」 に見えますが、実は左側は「数字」、右側は「数値」です。
…と言われても、見た目だけでは違いがわかりませんよね?
0 0
どちらも 「0」 に見えますが、実は左側は「数字」、右側は「数値」です。
…と言われても、見た目だけでは違いがわかりませんよね?
そこで、区別しやすいように ルール を決めましょう。
ルール①「文字列はダブルクォーテーション("")で囲む」
このルールを適用すると、次のようになります。
0 "0"
こうすると、右側の "0" は「文字列」だとわかります。
ルール② 「数値は 0~9 の数字を直接入力する」
これにより、次のように明確に区別できます。
0 "0"
数値 数字
ルール①「文字列はダブルクォーテーション("")で囲む」
このルールを適用すると、次のようになります。
0 "0"
こうすると、右側の "0" は「文字列」だとわかります。
ルール② 「数値は 0~9 の数字を直接入力する」
これにより、次のように明確に区別できます。
0 "0"
数値 数字
このように、値を直接記述する方法を「リテラル」と呼びます。
Javaにはこのような、決められた書き方で表すデータの種類が豊富に用意されています。
Javaにはこのような、決められた書き方で表すデータの種類が豊富に用意されています。
| データ型 | 例 | 説明 |
|---|---|---|
| int | 通常の整数表記 | 0, 10, 100, -50 |
| long | Lまたはlを値の末尾に付与 | 0L, 1000L, -1234124l |
| float | Fまたはfを値の末尾に付与 | 0.0F, 1.0F, -539.25f |
| double | 小数点を付ける (Dまたはdを値の末尾に付与しても良いが省略可能) |
3.14, -3.51D, -2.5d |
| char | シングルクォートで囲む | 'a', '1', 'B' |
| boolean | true,falseのみ | true false |
| String | ダブルクォートで囲む | "hoge", "fuga", "こんにちは" |
コラム
コンピュータの世界の最小単位「ビット」と「バイト」
データ型の説明で「int型の箱には数字が入る」「byte型の箱には小さな数字しか入らない」と学びました。
では、コンピュータの中で変数の「箱の大きさ」はどのように決まっているのでしょうか?
それを理解するための重要なキーワードが、ビット(bit)とバイト(byte)です。
では、コンピュータの中で変数の「箱の大きさ」はどのように決まっているのでしょうか?
それを理解するための重要なキーワードが、ビット(bit)とバイト(byte)です。
コンピュータは、実は「0」と「1」の数字しか理解することができません。
コンピュータの脳内には、電気の「オン(1)」と「オフ(0)」を切り替える小さなスイッチがたくさん並んでいると想像してください。
このスイッチ1つ分のデータ(0か1のどちらか)のことを「1ビット」と呼びます。
これがコンピュータが扱える一番小さなデータの単位です。
コンピュータの脳内には、電気の「オン(1)」と「オフ(0)」を切り替える小さなスイッチがたくさん並んでいると想像してください。
このスイッチ1つ分のデータ(0か1のどちらか)のことを「1ビット」と呼びます。
これがコンピュータが扱える一番小さなデータの単位です。
しかし、スイッチ1つでは「2種類」の情報しか表せません。
これでは少なすぎて不便なので、スイッチを8個ワンセットにして扱うルールが生まれました。
この「8ビットの集まり」のことを、1バイト(byte)と呼びます。スマートフォンの容量などでよく聞く「ギガバイト(GB)」の「バイト」も、ここから来ています。

スイッチが8個あると、「オン・オフ・オン・オン…」といった組み合わせが全部で 256通り(2を8回掛けた数)作れます。
Javaの基本データ型である byte 型は、名前の通り「ピッタリ1バイト」の大きさを持つ箱です。そのため、-128 から 127 までの合計256種類の数字を記憶できるのです。
これでは少なすぎて不便なので、スイッチを8個ワンセットにして扱うルールが生まれました。
この「8ビットの集まり」のことを、1バイト(byte)と呼びます。スマートフォンの容量などでよく聞く「ギガバイト(GB)」の「バイト」も、ここから来ています。

スイッチが8個あると、「オン・オフ・オン・オン…」といった組み合わせが全部で 256通り(2を8回掛けた数)作れます。
Javaの基本データ型である byte 型は、名前の通り「ピッタリ1バイト」の大きさを持つ箱です。そのため、-128 から 127 までの合計256種類の数字を記憶できるのです。
では、私たちが普段よく使う int 型はどうでしょうか?
int型の箱は「4バイト」、つまりスイッチが32個(8ビット×4)も並んだ大きな箱です。
スイッチが32個もあると、組み合わせはなんと 約42億通り(2の32乗)にもなります。
だからこそ、マイナス21億からプラス21億という大きな数字を安全に記憶しておくことができるというわけです。
int型の箱は「4バイト」、つまりスイッチが32個(8ビット×4)も並んだ大きな箱です。
スイッチが32個もあると、組み合わせはなんと 約42億通り(2の32乗)にもなります。
だからこそ、マイナス21億からプラス21億という大きな数字を安全に記憶しておくことができるというわけです。
プログラミングをしているときに普段はあまり意識しませんが、私たちがデータ型で用意している「変数の箱」の正体は、この小さなスイッチの集まりだったのです。
小数を表す「単精度」と「倍精度」の深い違い
データ型の学習で、小数を扱うための箱として float(フロート)と double(ダブル)の2種類があると学びました。
この2つの専門的な呼び名である単精度浮動小数点数と倍精度浮動小数点数の本当の意味を、前回の「ビットとバイト」の知識を使って紐解いてみましょう。
この2つの専門的な呼び名である単精度浮動小数点数と倍精度浮動小数点数の本当の意味を、前回の「ビットとバイト」の知識を使って紐解いてみましょう。
① 箱の大きさ(スイッチの数)が違う
float 型の箱は4バイト、つまり32個のスイッチ(ビット)でできています。
double 型の箱は8バイト、つまり64個のスイッチ(ビット)でできており、名前の通り float のちょうど「倍」の大きさを持っています。
float 型の箱は4バイト、つまり32個のスイッチ(ビット)でできています。
double 型の箱は8バイト、つまり64個のスイッチ(ビット)でできており、名前の通り float のちょうど「倍」の大きさを持っています。
② 正確に記録できる「細かさ」が違う
コンピュータは小数を記録するとき、「1.234 × 10の5乗」のような理科の授業で習う特別な形(指数表記)に直して、スイッチのオン・オフで記憶させます。このとき、用意されたスイッチの数によって「どこまで細かい数字を正確に記録できるか(有効桁数)」が決まります。
コンピュータは小数を記録するとき、「1.234 × 10の5乗」のような理科の授業で習う特別な形(指数表記)に直して、スイッチのオン・オフで記憶させます。このとき、用意されたスイッチの数によって「どこまで細かい数字を正確に記録できるか(有効桁数)」が決まります。
| 小数データ型の違い | |||
|---|---|---|---|
| データ型 | 専門的な呼び方 | 箱の大きさ | 正確に記録できる桁数(目安) |
| float | 単精度浮動小数点数 | 4バイト(32ビット) | 約 7桁 まで |
| double | 倍精度浮動小数点数 | 8バイト(64ビット) | 約 15桁 まで |
例えるなら、floatは「小さなメモ帳」、doubleは「大きな大学ノート」のようなものです。
円周率(3.1415926535...)のような長く続く小数を書き写すとき、小さなメモ帳(float)だと途中でスペースが足りなくなり、端っこを切り捨てて(四捨五入などの丸め込みをして)妥協しなければなりません。
しかし、倍の広さを持つノート(double)なら、より正確に長い桁まで書き留めておくことができます。
円周率(3.1415926535...)のような長く続く小数を書き写すとき、小さなメモ帳(float)だと途中でスペースが足りなくなり、端っこを切り捨てて(四捨五入などの丸め込みをして)妥協しなければなりません。
しかし、倍の広さを持つノート(double)なら、より正確に長い桁まで書き留めておくことができます。
③ なぜJavaではdoubleが当たり前に使われるの?
プログラミングの世界(特にゲームの物理計算やお金の計算など)では、小数点を使った計算を何百回、何千回と繰り返すことがあります。
もし float を使っていて毎回ほんの少しずつ「切り捨てられたズレ」が発生すると、それがチリツモで積み重なり、最終的に大きな計算間違い(誤差)を生んでしまいます。
プログラミングの世界(特にゲームの物理計算やお金の計算など)では、小数点を使った計算を何百回、何千回と繰り返すことがあります。
もし float を使っていて毎回ほんの少しずつ「切り捨てられたズレ」が発生すると、それがチリツモで積み重なり、最終的に大きな計算間違い(誤差)を生んでしまいます。
昔のコンピュータは容量が少なかったため、節約のために float がよく使われていました。
しかし現代のパソコンやスマートフォンは非常に性能が良いため、「容量の節約よりも、少しでも正確でズレの少ない計算」を優先すべきと考えられています。
そのためJavaのルールでは、プログラム内に 3.14 のような小数を普通に書くと、自動的に容量が大きく精度の高い double 型として安全に扱われるという仕組みになっているのです。
しかし現代のパソコンやスマートフォンは非常に性能が良いため、「容量の節約よりも、少しでも正確でズレの少ない計算」を優先すべきと考えられています。
そのためJavaのルールでは、プログラム内に 3.14 のような小数を普通に書くと、自動的に容量が大きく精度の高い double 型として安全に扱われるという仕組みになっているのです。
Unicodeってなんだろう?
Unicodeは2バイト(16ビット)で一文字を表現する、世界中の文字を一つにまとめ、コンピュータで扱うための国際的な標準規格です。
Javaのchar型は、2バイト(16ビット)の整数型です。
元々は、この2バイトで1つの文字を表すことを意図していました。
しかし、Unicodeの規格が拡張され、21ビットで1文字を表す文字が出現したため、char型だけではすべての文字を表現できなくなってしまいました。
主に絵文字や古代文字など、通常の16ビット形式では表現できない文字を含んでいます。
これには、漢字や特殊記号、さまざまな言語の文字も含まれます。
しかし、Javaのchar型は16ビットまでしか表現できないため、21ビットの文字を扱うことができません。
つまり、char型は厳密には「文字」ではなく、「UTF-16コードユニット」と呼ばれる16ビットの値を表す型となってしまいました。
この問題を解決するために、Java 1.5で導入されたのが「Code Point」という概念です。
Code Pointは、Unicodeで文字に割り当てられた一意の番号であり、21ビットで表現できます。
Javaでは、int型を使ってCode Pointを扱うことができます。
Stringクラスなどには、Code Pointを扱うメソッドが色々追加されるようになりました。
https://www.ne.jp/asahi/hishidama/home/tech/java/string.html#h_code_point
元々は、この2バイトで1つの文字を表すことを意図していました。
しかし、Unicodeの規格が拡張され、21ビットで1文字を表す文字が出現したため、char型だけではすべての文字を表現できなくなってしまいました。
主に絵文字や古代文字など、通常の16ビット形式では表現できない文字を含んでいます。
これには、漢字や特殊記号、さまざまな言語の文字も含まれます。
しかし、Javaのchar型は16ビットまでしか表現できないため、21ビットの文字を扱うことができません。
つまり、char型は厳密には「文字」ではなく、「UTF-16コードユニット」と呼ばれる16ビットの値を表す型となってしまいました。
この問題を解決するために、Java 1.5で導入されたのが「Code Point」という概念です。
Code Pointは、Unicodeで文字に割り当てられた一意の番号であり、21ビットで表現できます。
Javaでは、int型を使ってCode Pointを扱うことができます。
Stringクラスなどには、Code Pointを扱うメソッドが色々追加されるようになりました。
https://www.ne.jp/asahi/hishidama/home/tech/java/string.html#h_code_point
trueとfalseって数値なの?文字列なの?何者なの?
C言語からプログラミング言語を勉強した方は、真偽値はfalseが0、trueが0以外と習うはずです。
Javaではtrueとfalseの真偽値リテラルはどのような値になっているのでしょうか?
System.out.println()で出力してみても、真偽値はtrue,falseしか表示されません。
Javaではtrueとfalseの真偽値リテラルはどのような値になっているのでしょうか?
System.out.println()で出力してみても、真偽値はtrue,falseしか表示されません。
boolean型の実態は
https://github.com/openjdk/jdk/blob/master/src/java.base/share/native/include/jni.h
にこのように定義されています。


このように符号無しの文字型として定義されており、falseは0、trueは1としてJVM上では定義されています。
https://github.com/openjdk/jdk/blob/master/src/java.base/share/native/include/jni.h
にこのように定義されています。


このように符号無しの文字型として定義されており、falseは0、trueは1としてJVM上では定義されています。
Javaで使用可能なリテラルの一覧
| Javaで使用できるリテラル一覧 | ||
|---|---|---|
| データ型 | 例 | 説明 |
| int | 通常の整数表記 | 0, 10, 100, -50 |
| int(2進数) | 0bまたは0Bを値の先頭に付与する | 0B1010, 0b110001 |
| int(8進数) | 0を値の先頭に付与する | 012, 077 |
| int(16進数) | 0xまたは0Xを値の先頭に付与する | 0x4A, 0X3C, 0xff |
| long | Lまたはlを値の末尾に付与 | 0L, 1000L, -1234124l |
| float | Fまたはfを値の末尾に付与 | 0.0F, 1.0F, -539.25f |
| double | 小数点を付ける (Dまたはdを値の末尾に付与しても良いが省略可能) |
3.14, -3.51D, -2.5d |
| double, float(指数表記) | eまたはEを使用する | 2.5e3, 1.3E-4 |
| char | シングルクォートで囲む | 'a', '1', 'B' |
| boolean | true,falseのみ | true false |
| String | ダブルクォートで囲む | "hoge", "fuga", "こんにちは" |
| String(テキストブロック) | ダブルクォート3つで囲む | """Java13以降のテキストブロック""" |
| 参照型(nullリテラル) | 参照型変数のみに使用可能 | null |









