広告

手を動かして学ぶ Java入門 (プリミティブ型)

環境構築不要! ブラウザから直接コードを実行できます。
本記事では、プリミティブ型(基本データ型)について学びます。

15分くらいで、さくっと終わる記事をめざしています。


シリーズ一覧

続きは近日公開予定!

はじめに

この記事は 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 型は真偽値を扱います。
代入できるのは truefalse だけです。

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!

floatdouble は精度が違います。
doublefloat に比べて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言語でもっとも基本的な値をあつかうデータ型のことです。

プリミティブ型はクラスと比べてシンプルなので

  • 演算速度が速い
  • メモリ使用量が少なくすむ

などのメリットがあります。

ぜひ有効に活用していきたいですね。

それでは次回もお楽しみに!


関連記事

ページの先頭へ