データ型(プリミティブ)の全体像
Java のプリミティブ型は「値そのもの」を扱う最小単位のデータ型です。メモリ効率が良く、速度も速いので、数値計算やフラグ管理などの基礎に使われます。プリミティブは参照型(String や配列、クラスなど)と違い、オブジェクトではありません。したがってメソッドやフィールドは持たず、代入や演算は直接メモリ上の値に対して行われます。
整数型の基本と注意点
byte と short(小さい整数)
byte は 1 バイト(-128〜127)、short は 2 バイト(-32768〜32767)の範囲の整数です。大量のデータを扱うときにメモリを節約できますが、範囲が狭いので計算には不向きです。読み書きのフォーマットやバイナリ処理などに使う場面が多く、一般的なロジックでは int を優先します。
byte b = 127; // 最大値
short s = 30000; // 十分な範囲だが計算には狭い
Javaint(標準の整数)
int は 4 バイトの符号付き整数で、日常的な計算で最も使われます。配列のインデックス、ループのカウンタ、件数、ID などに向いています。範囲は約 ±21 億で、超えるとオーバーフローします。
int count = 2_000_000_000; // 読みやすさのためのアンダースコアは OK
count += 500_000_000; // オーバーフローして負の値になる可能性がある
Java重要な注意点は、オーバーフローが例外にならないことです。範囲を超えると値が循環してしまうため、合計や積が大きくなる見込みがある場合は long を選ぶべきです。
long(大きい整数)
long は 8 バイトの符号付き整数で、桁が大きいカウンタやタイムスタンプ(ミリ秒)、ファイルサイズなどに適します。リテラルは L を付けて表します(小文字 l は 1 と紛らわしいので避ける)。
long total = 10_000_000_000L; // L が必須
long millis = System.currentTimeMillis();
Javaint と long が混在する計算では、結果が自動で long に拡張されるため、型を揃えておくと安全です。
浮動小数点型の選び方と精度
float(軽量な小数)
float は 4 バイトの浮動小数点数で、リテラルに F を付けます。メモリ節約のために使われますが、精度が低いので計算誤差が目立つ場面があります。グラフィックスや大量の座標データなどで用途がありますが、一般的な数値計算では double を選ぶのが無難です。
float f = 3.14F;
Javadouble(標準の小数)
double は 8 バイトの浮動小数点数で、科学計算や一般的な小数に向いています。ただし、二進数で小数を表すため、通貨や厳密な小数計算には誤差がつきものです。金額計算では BigDecimal を使い、double を丸めでごまかさないのがプロの作法です。
double pi = 3.141592653589793;
System.out.println(0.1 + 0.2); // 0.30000000000000004 のような誤差が出ることがある
Java浮動小数点の比較は、完全一致ではなく「許容誤差(イプシロン)内に収まるか」を判定するのが定番です。
文字と真偽の基礎
char(文字)
char は 2 バイトの UTF-16 コード単位を保持します。単一文字はシングルクォートで書き、エスケープが使えます。サロゲートペアが必要な絵文字や一部の漢字拡張では char 一つでは足りないことがあるため、「コードポイント」の理解も重要です。文字列処理は通常 String と StringBuilder を使い、char は補助的に扱います。
char c = 'A';
char newline = '\n';
System.out.println(c);
Javaboolean(真偽)
boolean は true または false の二値のみを持ちます。条件分岐やフラグで多用されます。数値への自動変換はありません(C 言語のような 0/非 0 ではない)。条件式はできるだけ短く明快にし、複雑になる場合は途中変数に切り出して読みやすさを優先します。
boolean isMember = true;
if (isMember && !expired) {
System.out.println("Welcome");
}
Javaリテラル、キャスト、演算の深掘り
数値リテラルの書き方
整数リテラルは 10 進が基本ですが、0b(2 進)、0(8 進)、0x(16 進)も使えます。桁区切りの _ は可読性向上に有効です。
int bin = 0b1010; // 10
int oct = 010; // 8
int hex = 0xA; // 10
int readable = 1_000_000;
Java浮動小数点は指数表記(1.23e3 = 1230)も可能です。float は F、double は接尾辞不要です。
double exp = 1.23e3; // 1230.0
float small = 1.5F; // float を明示
Java暗黙の拡張と明示の縮小
小さい型から大きい型への拡張(int → long、float → double)は自動で行われます。大きい型から小さい型への縮小(long → int)は情報が失われる可能性があるため、明示的キャストが必要です。
long big = 3_000_000_000L;
int small = (int) big; // 値が壊れる可能性がある(範囲外)
Java計算の途中で型が決まるため、リテラルやオペランドの型を揃えておくと意図しない型変換を防げます。
整数割り算と演算の型
整数同士の割り算は小数を切り捨てます。小数が欲しければどちらかを double(または float)にします。加算や乗算では「より広い型」に結果が昇格するため、int * long は long になります。
int a = 5, b = 2;
System.out.println(a / b); // 2
System.out.println(a / (double)b);// 2.5
int x = Integer.MAX_VALUE;
int y = 2;
int overflow = x + y; // オーバーフロー
Java実用例で理解を固める
例 1: 面積計算(型選択と丸め)
public class Area {
public static void main(String[] args) {
double width = 3.5;
double height = 2.2;
double area = width * height;
System.out.printf("area=%.2f%n", area); // 2 桁に丸めて表示
}
}
Javadouble を使うことで小数の面積を扱えます。表示の丸めはフォーマット指定子で行い、内部計算の誤差管理は必要に応じて別途検討します。
例 2: カウンタの安全な拡張(int→long)
public class Counter {
public static void main(String[] args) {
long total = 0L;
for (int i = 0; i < 5_000_000_000L; i++) { // 実際には大きすぎて回せない例
total++; // 理念的には long を使う
}
System.out.println(total);
}
}
Java巨大な回数や合計値には long を使う判断が必要です。実務ではストリームやバッチ処理で集計する際、型の選択が正確さを左右します。
例 3: 文字と文字列の橋渡し(char と String)
public class CharDemo {
public static void main(String[] args) {
char c = 'J';
String s = "Java";
System.out.println(c);
System.out.println(s.charAt(0)); // 'J'
System.out.println(s.length()); // 4
}
}
Java単一文字は char、複数文字は String で扱います。文字列の操作は String のメソッドを使うのが基本です。
設計の指針(重要ポイントの深掘り)
プリミティブ型は「速く・軽く・シンプル」です。標準の選択は、整数なら int、小数なら double。範囲が足りない、精度が不十分という兆候が見えたら、整数は long、小数は BigDecimal(参照型)に切り替えます。通貨やポイント計算は誤差が許されないため、double を使い続けない勇気が必要です。文字は char より String を優先し、文字コードやサロゲートの罠を避けます。ブールロジックは短く明快に、複雑なら途中変数で分解して可読性を確保しましょう。
