変数と型

以下は「Java基礎構文① 変数と型」の記事本文(WordPressブロックエディターへそのまま貼り付け可)です。水平線は使用していません。

Java基礎構文① 変数と型

要約

  • Javaは強い型付け言語。変数は「宣言 → 初期化 → 利用」の順で扱います。
  • 型は「基本型(primitive)」と「参照型(reference)」に大別されます。
  • 文字列は不変(immutable)。金額などはBigDecimalを用います。
  • varはローカル変数限定で型推論。必ず初期化が必要です。

1. 変数の基本

int count;                 // 宣言
count = 10;                // 代入
int size = 20;             // 宣言と初期化
final double PI = 3.14159; // 定数(再代入不可)
  • スコープは宣言したブロック { ... } 内に限定。
  • シャドーイングは可読性低下のため原則回避。

var(Java 10+)

var n = 10;        // 推論: int
var name = "Bob";  // 推論: String
  • ローカル変数のみ使用可(フィールド・引数・戻り値は不可)。
  • 初期化必須。可読性を損ねる場合は明示的な型を優先。

2. 型の種類

2.1 基本型(primitive)

  • 整数: byte(8), short(16), int(32), long(64)
    例)int x = 123;long y = 10_000_000_000L;

  • 浮動小数: float(32), double(64)
    例)float f = 3.14f;double d = 3.14;

  • 文字: char(16, UTF-16コード単位)
    例)char c = 'A';

  • 真偽: boolean(サイズ実装依存)
    例)boolean ok = true;

補足:絵文字などサロゲートペアはchar1つで表せない場合があります。


2.2 参照型(reference)

  • String、配列、クラス/インターフェースのインスタンス、enumrecord など。
  • nullを取り得るため、NPE対策が必要です。

3. 文字列と文字

String s = "Hello";
s = s + " World";        // Stringは不変。新インスタンスが生成される
StringBuilder sb = new StringBuilder();
sb.append("Hello").append(" World");
String fast = sb.toString(); // 連結が多い場合はStringBuilder推奨
  • 内容比較は.equals()==は参照比較です。
"abc".equals(someString); // 内容比較(推奨)
  • String.length()はUTF-16の長さ。コードポイント数は:
int cps = s.codePointCount(0, s.length());

4. 数値演算の注意点

double a = 0.1 + 0.2; // 0.30000000000000004(桁誤差)
  • 金額など厳密小数はBigDecimalを使用します。
import java.math.BigDecimal;
BigDecimal p = new BigDecimal("0.1").add(new BigDecimal("0.2")); // 0.3

5. 型変換(キャスト)

  • 拡大変換(安全):int -> long -> float -> double
  • 縮小変換(要キャスト・精度喪失の可能性):
long x = 100;     // 拡大: OK
int y = (int) x;  // 縮小: 明示キャスト

6. 配列とArrayList

int[] a = new int[3];
a[0] = 10; a[1] = 20; a[2] = 30;

int[] b = { 1, 2, 3 };  // 配列リテラル

import java.util.ArrayList;
var list = new ArrayList<String>();
list.add("A"); list.add("B");
String first = list.get(0);
  • 配列は固定長。ArrayListは可変長。
  • ジェネリクスで型安全に扱います(new ArrayList<String>())。

7. enumrecord(Java 16+)

enum Role { ADMIN, USER, GUEST }

record Point(int x, int y) {} // 不変データキャリア
Point p = new Point(10, 20);
  • recordはフィールド、コンストラクタ、equals/hashCode/toStringを自動生成。

8. Optional の基本(Null対策)

import java.util.Optional;

Optional<String> maybe = Optional.of("Bob");
String name = maybe.orElse("Unknown");
  • 戻り値にOptional<T>を用いると「値がない」状態を明示できます。
  • フィールドにOptionalは原則使いません(オブジェクト肥大化回避)。

9. 参照と値、引数の挙動

  • Javaはすべて値渡し。参照型は「参照という値」を渡します。
class Box { int v; }
void inc(Box b){ b.v++; } // 参照先の中身は変わる
void reassign(Box b){ b = new Box(); b.v = 999; } // 呼び出し側の参照は変わらない

10. 1ファイルで動く最小サンプル

public class BasicsVariables {
    enum Role { ADMIN, USER, GUEST }
    record Point(int x, int y) {}

    public static void main(String[] args) {
        int count = 10;
        long big = 10_000_000_000L;
        double price = 123.45;

        var ok = true;      // boolean
        var name = "Alice"; // String

        String msg = "Hello";
        msg = msg + " Java";
        System.out.println(msg); // Hello Java

        int[] nums = {1, 2, 3};
        java.util.ArrayList<String> list = new java.util.ArrayList<>();
        list.add("A"); list.add("B");
        System.out.println(list.get(0)); // A

        Role r = Role.USER;
        Point p = new Point(3, 5);
        System.out.println(r + " " + p);

        long lx = 100;
        int ix = (int) lx;

        String s1 = new String("abc");
        String s2 = "abc";
        System.out.println(s1.equals(s2)); // true(内容)
        System.out.println(s1 == s2);      // false(参照)

        java.util.Optional<String> maybe = java.util.Optional.of("Bob");
        System.out.println(maybe.orElse("Unknown"));
    }
}

ベストプラクティス(要点)

  • 意味のある型を選ぶ(貨幣=BigDecimal、識別子=String/UUID 等)。
  • 文字列比較は.equals()、多連結はStringBuilder
  • varは短いスコープでのみ使用。可読性を最優先。
  • nullは最小化し、戻り値はOptionalで明示。
  • 定数はpublic static final+大文字スネークで命名統一。