手を動かして学ぶ Java入門 (プリミティブ型)
環境構築不要! ブラウザから直接コードを実行できます。
本記事では、プリミティブ型(基本データ型)について学びます。
15分くらいで、さくっと終わる記事をめざしています。
シリーズ一覧
- シリーズ
- 手を動かして学ぶ Java入門 (Hello world 編)
- 手を動かして学ぶ Java入門 (数値と演算)
- 手を動かして学ぶ Java入門 (数値と変数)
- 手を動かして学ぶ Java入門 (コメントの書き方)
- 手を動かして学ぶ Java入門 (文と式の違い)
- 手を動かして学ぶ Java入門 (if文)
- 手を動かして学ぶ Java入門 (if-else文、if-elseif文)
- 手を動かして学ぶ Java入門 (文字列の連結)
- 手を動かして学ぶ Java入門 (while文)
- 手を動かして学ぶ Java入門 (break文)
- 手を動かして学ぶ Java入門 (continue文)
- 手を動かして学ぶ Java入門 (for文)
- 手を動かして学ぶ Java入門 (クラスの超基本)
- 手を動かして学ぶ Java入門 (クラス・メソッド)
- 手を動かして学ぶ Java入門 (クラス・フィールド)
- 手を動かして学ぶ Java入門 (クラス・コンストラクタ)
- 手を動かして学ぶ Java入門 (文字列クラス)
- 手を動かして学ぶ Java入門 (静的メソッド)
- 手を動かして学ぶ Java入門 (静的フィールド)
- 手を動かして学ぶ Java入門 (定数の定義)
- 手を動かして学ぶ Java入門 (クラス継承の超基本)
- 手を動かして学ぶ Java入門 (メソッドのオーバーライド)
- 手を動かして学ぶ Java入門 (メソッドのオーバーロード)
- 手を動かして学ぶ Java入門 (thisキーワード)
- 手を動かして学ぶ Java入門 (superキーワード)
- 手を動かして学ぶ Java入門 (抽象クラスと抽象メソッド)
- 手を動かして学ぶ Java入門 (インタフェースの基本)
- 手を動かして学ぶ Java入門 (Objectクラス)
- 手を動かして学ぶ Java入門 (プリミティブ型)
続きは近日公開予定!
はじめに
この記事は paiza.IO の「Online Java compiler」を利用しています。
2025/2/27 現在、上記環境の Java バージョンは 18 です。(paiza.IO利用ガイド)
実行したコードは paiza.IO で保存および公開されることがあります。
そのため、個人情報などの機密性の高い情報は、コードとして入力しないようにご注意ください。
詳細は paiza.IO の利用規約およびプライバシーポリシーをご確認ください。
概要
プリミティブ型またはプリミティブデータ型(英: primitive data type)は、データ型の分類用語であり、データ型の中で最も基本的なものを指している。基本データ型(basic data type)とも言われる[1]。
プリミティブ型とは、Java言語で もっとも基本的な値 をあつかうデータ型のことです。
今までも使ってきた
- int (整数)
- double (実数)
- boolean (真偽値)
などですね。
int num = 123;
double pi = 3.14;
boolean result = true;
プリミティブ型はクラスではありません。
よって、Objectクラス を暗黙的に 継承していません。
ここが大きなポイントになります。
また、プリミティブ型はクラスと比べてシンプルなので
- 演算速度が速い
- メモリ使用量が少なくすむ
などのメリットがあります。
プリミティブ型の一覧
Java言語で使えるプリミティブ型の一覧です。
プリミティブ型 | デフォルト値 | 範囲 | サイズ |
---|---|---|---|
boolean | false | false / true | - |
byte | (byte)0 | -128 ~ 127 | 8ビット |
short | (short)0 | -32768 ~ 32767 | 16ビット |
int | 0 | -2147483648 ~ 2147483647 | 32ビット |
long | 0L | -9223372036854775808 ~ 9223372036854775807 | 64ビット |
char | '\u0000' | '\u0000' ~ '\uffff' (0 ~ 65535) | 16ビット |
float | 0.0f | 1.4E-45 ~ 3.4028235E38 | 32ビット(IEEE754浮動小数点数) |
double | 0.0d | 4.9E-324 ~ 1.7976931348623157E308 | 64ビット(IEEE754浮動小数点数) |
この表で大事なのは 範囲 のところですね。
そのプリミティブ型が扱える数値の範囲です。
サイズ については、最初のうちは気にしなくても OK です。
大きいほど扱える数値の範囲が広くなる … だけどメモリ使用量も多くなる、という感じの理解でよいでしょう。
boolean
プリミティブ型 | デフォルト値 | 範囲 | サイズ |
---|---|---|---|
boolean | false | false / true | - |
boolean 型は真偽値を扱います。
代入できるのは true と false だけです。
boolean b1 = true;
boolean b2 = false;
if文 で使う比較演算子の結果も、この boolean 型になりますね。
boolean b = 1 < 2;
System.out.println(b); // true
byte, short, int, long
プリミティブ型 | デフォルト値 | 範囲 | サイズ |
---|---|---|---|
byte | (byte)0 | -128 ~ 127 | 8ビット |
short | (short)0 | -32768 ~ 32767 | 16ビット |
int | 0 | -2147483648 ~ 2147483647 | 32ビット |
long | 0L | -9223372036854775808 ~ 9223372036854775807 | 64ビット |
この3つは、数値(整数)を扱います。
違いは扱える範囲です。
もっともよく使うのは int ですね。
扱える値の範囲も -2147483648 ~ 2147483647 とそれなりに大きいので困ることは少ないでしょう。
もし int で足りない場合は long を使います。
ただし、int の範囲におさまらない大きな値を表記するときには数値の最後に L をつける必要があります。
int i = 1234567890;
long l = 123456789012345L;
^ <--- 大きな値のときは L をつける!
ノート
- long よりさらに大きな数値を扱いたい場合は BigInteger クラスを使います。
short は無理に使わなくてよいかもしれません。
メモリ使用量が気にならなければ int で代用してしまっても問題ないでしょう。
short s1 = 1234;
short s2 = -789;
byte については、サイズが1バイトということで バイナリデータ を扱うときによく使います。
byte b1 = 123;
byte b2 = -99;
char
プリミティブ型 | デフォルト値 | 範囲 | サイズ |
---|---|---|---|
char | '\u0000' | '\u0000' ~ '\uffff' (0 ~ 65535) | 16ビット |
char 型は「1文字」を扱います。
文字列は String クラス、文字は char 型というわけですね。
文字列は "~" と、ダブルクォーテーションで囲んで書きました。
String str = "abc";
^^^^^ <--- ダブルクォーテーションで囲む!
一方、文字は '~' と、シングルクォーテーションを使います。
char c = 'a';
^^^ <--- シングルクォーテーションで囲む!
'A' や '@' などの半角文字はもちろん、'あ' や '伊' などの全角文字も1文字として扱えます。
// これらはすべてOK
char c1 = 'A';
char c2 = '@';
char c3 = 'あ';
char c4 = '伊';
補足
- 以前の記事 で少しだけ話題に出したサロゲート文字については char 型では扱えません。
float, double
プリミティブ型 | デフォルト値 | 範囲 | サイズ |
---|---|---|---|
float | 0.0f | 1.4E-45 ~ 3.4028235E38 | 32ビット(IEEE754浮動小数点数) |
double | 0.0d | 4.9E-324 ~ 1.7976931348623157E308 | 64ビット(IEEE754浮動小数点数) |
この2つは、数値(実数)を扱います。
正確には 浮動小数点数 です。
浮動小数点数の詳細については、入門記事としては少し難しいので説明は割愛します。
簡単にいうと、コンピュータが扱いやすい実数の形式です。
ただし、計算の結果、誤差がでることもあります。そこはご注意ください。
上の表にある "1.4E-45" という E を使った表記も、浮動小数点数の表記法です。
ただ、普通の小数点を使った表記も使えるので、最初のうちはそちらを使っても問題ないでしょう。
double pi = 3.14;
^^^^ <--- 小数表記でもOK!
float と double は精度が違います。
double は float に比べて2倍の精度を持ちます。
float 型の変数に実数値を代入するときは、数値の最後に f が必要です。
f をつけないとコンパイルエラーとなります。
float f1 = 1.23f;
^ <--- ★ここ!
double 型の変数に実数値を代入するときは、数値の最後に d が必要です。
だだし、d は省略できます
double d1 = 0.789d;
^ <--- ★ここ!
double d2 = 0.789;
^ <--- ★省略してもOK
キャスト (型変換)
型変換(かたへんかん、英: type conversion)とはプログラムにおいて、あるデータ型を他のデータ型に変換することである[1]。型キャスト(英: type casting)とも呼ばれる[2]。
異なる型へ数値を代入したいときはどうすればよいでしょうか?
例えば、
- short 型の変数 → byte 型の変数へ代入
というコードを考えてみましょう。
byte b = 123;
short s = b;
これは問題ありません。
なぜなら、short 型は byte 型より扱える数値の範囲が大きいからです。
プリミティブ型 | 範囲 |
---|---|
byte | -128 ~ 127 |
short | -32768 ~ 32767 |
これを暗黙の型変換といいます。
それなら逆はどうでしょうか?
short s = 200;
byte b = s;
short 型の変数 s の値は 200 です。
これは byte 型で扱える数値の最大値 127 より大きいです。
実際にプログラムを動かして確認してみましょう。
コードは変更せずに、そのまま「実行(Ctrl-Enter)」ボタンを押してください。
(表示がおかしいときは「コードの再読み込み」ボタンを押してみてください)
いかがでしたでしょうか? 下記のようなコンパイルエラーが出たら成功です。
Main.java:5: error: incompatible types: possible lossy conversion from short to byte
byte b = s;
^
1 error
"incompatible types: possible lossy conversion from short to byte" とは、超意訳すると…
- short から byte へ暗黙の型変換はできません
という感じです。
とはいえ、short 型から byte 型へと変換したいこともあるでしょう。
そんなときに使うのがキャストです。
キャストは、
- ( 変換したい型 )
というように書きます。
先ほどの例だと、
short s = 200;
byte b = (byte) s;
という感じですね。
実際にプログラムを動かして確認してみましょう。
結果がどうなるか予想してから「実行(Ctrl-Enter)」ボタンを押してください。
(表示がおかしいときは「コードの再読み込み」ボタンを押してみてください)
いかがでしたでしょうか? 「出力」のところに
short = 200
byte = -56
と表示されたら成功です。
さて、無事にコンパイルエラーは解消できました。
しかし、キャストした結果、byte 型の変数 b の値は…
200
↓ キャスト
-56
となりました。
200 という数値は byte 型には入りきらないので、キャストで数値がまるめられたわけですね。
ただし、まるめられるからといって byte 型の最大値である 127 になるわけではありません。
なぜそうなるのかは、少し難しいのでこの記事では説明を割愛します。
なにはともあれ、キャストすると
- 元の数値とは違う値になる危険性がある
ということを理解したうえで使うようにしましょう。
応用問題
【問題】
まずは、下記のプログラムをそのまま「実行(Ctrl-Enter)」してみましょう。
結果はコンパイルエラーになったはずです。
Main.java:8: error: incompatible types: possible lossy conversion from long to int
int result = num1 + num2 + num3;
^
1 error
これは、
int result = num1 + num2 + num3;
という計算式で、暗黙の型変換ができない変数があったために発生しています。
そこで問題です。
キャストを使ってコンパイルエラーを解消し、プログラムを実行すると、
600
と「出力」に表示されようにしてください。
それではキャストを追加してから「実行(Ctrl-Enter)」してみましょう。
(表示がおかしいときは「コードの再読み込み」ボタンを押してみてください)
無事に、
600
と出力されましたでしょうか?
もし解けなかった場合は、下記の回答例をご参照ください。
回答例
【コード】
public class Main {
public static void main(String[] args) {
byte num1 = 100;
short num2 = 200;
long num3 = 300;
int result = num1 + num2 + (int) num3;
System.out.println(result);
}
}
もしくは、計算式のところを
int result = (int) (num1 + num2 + num3);
としてもよいでしょう。
【出力】
600
まとめ
プリミティブ型とは、Java言語でもっとも基本的な値をあつかうデータ型のことです。
プリミティブ型はクラスと比べてシンプルなので
- 演算速度が速い
- メモリ使用量が少なくすむ
などのメリットがあります。
ぜひ有効に活用していきたいですね。
それでは次回もお楽しみに!
関連記事
- シリーズ
- 手を動かして学ぶ Java入門 (Hello world 編)
- 手を動かして学ぶ Java入門 (数値と演算)
- 手を動かして学ぶ Java入門 (数値と変数)
- 手を動かして学ぶ Java入門 (コメントの書き方)
- 手を動かして学ぶ Java入門 (文と式の違い)
- 手を動かして学ぶ Java入門 (if文)
- 手を動かして学ぶ Java入門 (if-else文、if-elseif文)
- 手を動かして学ぶ Java入門 (文字列の連結)
- 手を動かして学ぶ Java入門 (while文)
- 手を動かして学ぶ Java入門 (break文)
- 手を動かして学ぶ Java入門 (continue文)
- 手を動かして学ぶ Java入門 (for文)
- 手を動かして学ぶ Java入門 (クラスの超基本)
- 手を動かして学ぶ Java入門 (クラス・メソッド)
- 手を動かして学ぶ Java入門 (クラス・フィールド)
- 手を動かして学ぶ Java入門 (クラス・コンストラクタ)
- 手を動かして学ぶ Java入門 (文字列クラス)
- 手を動かして学ぶ Java入門 (静的メソッド)
- 手を動かして学ぶ Java入門 (静的フィールド)
- 手を動かして学ぶ Java入門 (定数の定義)
- 手を動かして学ぶ Java入門 (クラス継承の超基本)
- 手を動かして学ぶ Java入門 (メソッドのオーバーライド)
- 手を動かして学ぶ Java入門 (メソッドのオーバーロード)
- 手を動かして学ぶ Java入門 (thisキーワード)
- 手を動かして学ぶ Java入門 (superキーワード)
- 手を動かして学ぶ Java入門 (抽象クラスと抽象メソッド)
- 手を動かして学ぶ Java入門 (インタフェースの基本)
- 手を動かして学ぶ Java入門 (Objectクラス)
- 手を動かして学ぶ Java入門 (プリミティブ型)