Java 入門

Java 基本データ型

プリミティブ型(Primitive data types)は、変数がどのような種類の値を保持できるか、またその変数に対してどのような操作が可能かを決定する極めて重要な要素です。

本章では、Javaにおいて最も重要かつ頻繁に使用される4つのプリミティブ型(int、float、boolean、char)について、体系的に整理して解説します。それぞれの特性、具体的なユースケース、そしてそれらの核心的な違いを深く探求し、より高度なデータ処理を学ぶための堅固な基礎を築いていきましょう。

1. 整数型 (int)

int(Integerの略称)は、小数を伴わない整数を格納するためのデータ型です。Javaにおいて最も汎用的で、かつ基礎的なデータ型の一つです。

1.1 int のコア特性

  • メモリサイズ (Size): int はメモリ内で 4バイト (32ビット) を占有します。
  • 値の範囲 (Range): 一つの int 変数が保持できる値は、-231 から 231-1(つまり、-2,147,483,648 から 2,147,483,647)までです。
  • デフォルト値 (Default Value): 初期値を代入せずに int 変数を宣言した場合(クラスのメンバ変数に限る)、デフォルト値は 0 となります。

1.2 int コード実戦

public class IntExamples {
    public static void main(String[] args) {
        // int変数の宣言と初期化
        int age = 30;
        System.out.println("年齢: " + age); // 出力: 年齢: 30

        // カウント処理にintを使用
        int numberOfStudents = 150;
        System.out.println("学生数: " + numberOfStudents); // 出力: 学生数: 150

        // intの最大値と最小値のデモンストレーション
        int maxIntValue = Integer.MAX_VALUE;
        int minIntValue = Integer.MIN_VALUE;
        System.out.println("intの最大値: " + maxIntValue); // 出力: intの最大値: 2147483647
        System.out.println("intの最小値: " + minIntValue); // 出力: intの最小値: -2147483648

        // 最大値を超えた場合の挙動 (整数オーバーフロー / Integer Overflow)
        int overflowedValue = maxIntValue + 1;
        System.out.println("オーバーフロー後の値: " + overflowedValue); // 出力: -2147483648 (最小値へラップアラウンドする)

        // 最小値を下回った場合の挙動 (整数アンダーフロー / Integer Underflow)
        int underflowedValue = minIntValue - 1;
        System.out.println("アンダーフロー後の値: " + underflowedValue); // 出力: 2147483647 (最大値へラップアラウンドする)
    }
}

1.3 開発における注意点

  • 規定の範囲内の整数を格納する必要がある場合は、第一選択として int を使用してください。
  • 数学的な演算を行う際は、特に極端に大きな数値を扱う場合にオーバーフローやアンダーフローのリスクに常に警戒してください。21億を超える巨大な数値を扱う必要がある場合は、long 型(後の章で解説)の使用を検討してください。
  • int は、カウンタ、配列のインデックス、および分割不可能な数量を表現するために広く利用されます。

2. 浮動小数点型 (float)

float 型は単精度浮動小数点を格納するために使用されます。平たく言えば、小数部分を持つ数値を扱うための型です。

2.1 float のコア特性

  • メモリサイズ (Size): floatint と同様に 4バイト (32ビット) を占有します。
  • 値の範囲 (Range): およそ ±1.4 x 10-45 から ±3.4 x 1038 の範囲です。
  • 精度 (Precision):float はおよそ 7桁 の10進有効数字の精度を提供します。これは、小数点以下または全体の長さが7桁を超えると、計算結果が不正確になる可能性があることを意味します。
  • デフォルト値 (Default Value): 未初期化の float 変数のデフォルト値は 0.0f です。
  • 接尾辞 (Suffix): Javaでは、記述された小数はデフォルトでより精度の高い double 型として認識されます。システムに明示的に float であることを伝えるには、数値の末尾に f または F を付ける必要があります。

2.2 float コード実戦

public class FloatExamples {
    public static void main(String[] args) {
        // float変数の宣言と初期化
        float price = 19.99f; // 末尾の 'f' 接尾辞に注意
        System.out.println("価格: " + price); // 出力: 価格: 19.99

        // 測定データにfloatを使用
        float temperature = 25.5f;
        System.out.println("温度: " + temperature); // 出力: 温度: 25.5

        // 精度落ち(精度限界)のデモンストレーション
        float largeFloat = 123456789.123456789f;
        System.out.println("巨大な浮動小数点数: " + largeFloat); // 出力例: 1.23456792E8 (精度がどのように失われるか確認)

        // 除算による浮動小数点数の生成
        float result = 10.0f / 3.0f;
        System.out.println("除算結果: " + result); // 出力: 除算結果: 3.3333333
    }
}

2.3 開発における注意点

  • 小数を格納する必要があり、かつメモリ使用量を抑えたい場合に float を使用します。
  • float の精度の限界には常に注意してください。極めて高い精度が要求されるアプリケーション(金融計算など)では、double 型(後の章で解説)や BigDecimal クラスの使用を検討してください。
  • 浮動小数点のリテラルを宣言する際は、コンパイルエラーを避けるために f または F 接尾辞を忘れないようにしましょう。
  • float は、センサーの測定データ、科学計算用データ、およびグラフィックスの座標計算などによく使われます。

3. ブーリアン型 (boolean)

boolean 型は論理値を表すための専用の型で、値は true(真) または false(偽) のいずれかのみです。プログラムの制御フローや実行の意思決定を支える基盤となります。

3.1 boolean のコア特性

  • メモリサイズ (Size): Javaの公式仕様では boolean のサイズを厳密に定義していません。これは具体的な JVM の実装に依存しますが、通常は極めて小さなメモリ(一般的には1バイト)を占有します。
  • 値 (Values): booleantrue または false の二つの値のみを保持できます。
  • デフォルト値 (Default Value): 未初期化の boolean 変数のデフォルト値は false です。

3.2 boolean コード実戦

public class BooleanExamples {
    public static void main(String[] args) {
        // boolean変数の宣言と初期化
        boolean isJavaFun = true;
        boolean isFishMammal = false;
        
        System.out.println("Javaは楽しいですか? " + isJavaFun); // 出力: true
        System.out.println("魚は哺乳類ですか? " + isFishMammal); // 出力: false

        // 条件分岐 (if文) でのbooleanの使用
        if (isJavaFun) {
            System.out.println("Javaの学習を始めましょう!"); // 出力されます
        } else {
            System.out.println("他の言語を試してみるのもいいかもしれません。");
        }

        // 比較演算によるboolean結果の生成
        int x = 10;
        int y = 5;
        boolean isXGreaterThanY = x > y;
        System.out.println("xはyより大きいですか? " + isXGreaterThanY); // 出力: true
    }
}

3.3 開発における注意点

  • 「オン/オフ」や「成功/失敗」など、二つの状態しかない事象を表現するために boolean を使用します。
  • boolean は、条件文やループによるプログラムの実行プロセス制御の中核を成します。
  • ブール式(論理式)は、通常、比較演算や論理演算の結果として得られます。

4. 文字型 (char)

char 型は、単一の文字を格納するために使用されます。これは Unicode 文字を表しており、異なる言語の広範な文字セットを表現することが可能です。

4.1 char のコア特性

  • メモリサイズ (Size): char はメモリ内で 2バイト (16ビット) を占有します。
  • 値の範囲 (Range): char は U+0000 から U+FFFF(つまり 0 から 65,535)までの Unicode 文字を表現できます。
  • デフォルト値 (Default Value): 未初期化の char 変数のデフォルト値は '\u0000'(空文字)です。
  • 表現形式 (Representation): 文字は必ずシングルクォート (' ') で囲む必要があります。

4.2 char コード実戦

public class CharExamples {
    public static void main(String[] args) {
        // char変数の宣言と初期化
        char initial = 'J';
        char grade = 'A';
        char currencySymbol = '$';
        
        System.out.println("イニシャル: " + initial); // 出力: J
        System.out.println("成績: " + grade); // 出力: A
        System.out.println("通貨記号: " + currencySymbol); // 出力: $

        // Unicodeエスケープシーケンスの使用
        char copyrightSymbol = '\u00A9'; // 著作権記号 (©) のUnicode
        System.out.println("著作権記号: " + copyrightSymbol); // 出力: ©

        // 数字を文字として表現
        char numberChar = '7'; // 注意: これは文字の '7' であり、数値の 7 ではありません
        System.out.println("文字としての数字: " + numberChar); // 出力: 7

        // 文字を整数として処理 (ASCII/Unicode値に基づく)
        int charAsInt = initial; // charからintへの暗黙的な変換
        System.out.println("文字の整数値: " + charAsInt); // 出力: 74 ('J' の ASCII/Unicode値)
    }
}

4.3 開発における注意点

  • アルファベット、数字、記号、制御文字などの単一の文字を保存するために char を使用します。
  • char は文字列(String)操作やテキスト処理の内部で頻繁に利用されます。
  • char が Unicode 文字を代表していることを理解しておけば、多言語の複雑な文字セットも扱えるようになります。
  • キーボードから直接入力できない特殊文字を表現するには、Unicodeエスケープシーケンス (\uXXXX) を利用します。