Java 逆引き集 | 変数宣言(プリミティブ/参照型) — 型選びと初期化

Java Java
スポンサーリンク

変数宣言の基本

Javaの変数は「型 名称 = 初期値;」の形で宣言します。型は“何を入れる箱か”を決めるもの。プリミティブ型は値そのものを、参照型は“モノが置いてある場所(アドレス)”を持ちます。

// プリミティブ型(値そのもの)
int age = 20;
double price = 1999.5;
char grade = 'A';
boolean isMember = true;

// 参照型(場所への参照)
String name = "Tanaka";       // 文字列(参照型だがリテラルで簡単に作れる)
int[] scores = new int[3];    // 配列は new が必要
scores[0] = 80;

Person p = new Person("Sato"); // 自作クラスも参照型
Java
  • ローカル変数の初期化: メソッド内で宣言した変数は、使う前に必ず初期化が必要です。
  • フィールドの初期値: クラスのフィールドは未代入でも型に応じたデフォルト値が入ります(例: int は 0、boolean は false、参照型は null)。

プリミティブ型一覧と選び方

代表的な用途おおまかなサイズ/特徴典型的初期値の例
byteバイナリやIOでの小さい整数8ビット0
shortメモリ節約の整数(稀)16ビット0
int一般的な整数32ビット(最もよく使う)0
long大きな整数(ID、時刻等)64ビット0L
float小数(厳密さ不要)32ビット単精度0.0f
double小数(通常はこちらを使う)64ビット倍精度0.0
char文字(Unicode1文字)16ビット‘\u0000’
boolean真偽値true/false(サイズ未規定)false
  • 選び方の指針:
    • 整数: まずは int。int で足りないほど大きい値なら long。サイズを厳密に制御したい場合のみ byte/short。
    • 小数: 精度を重視するなら double。メモリや特定APIの都合でのみ float。
    • 文字: 1文字なら char、複数文字は String。
    • 真偽: 条件フラグは boolean 一択。

参照型の基本(String/配列/クラス)

参照型は「オブジェクトがある場所」を持ちます。複数の変数が同じオブジェクトを参照すると、片方の変更がもう片方からも“見える”ことがあります。

// String は参照型だが「不変」:中身は変更されず、新しい文字列が作られる
String a = "Hello";
String b = a;
b = "World";
System.out.println(a); // Hello(a は影響を受けない)
System.out.println(b); // World

// 配列は「可変」:要素を書き換えると、同じ配列を参照するすべてに影響
int[] arr1 = {1, 2};
int[] arr2 = arr1;   // 同じ配列を参照
arr2[0] = 99;
System.out.println(arr1[0]); // 99(arr1 も変わって見える)

// クラスの参照
class Person {
    String name;
    Person(String name) { this.name = name; }
}
Person p1 = new Person("Sato");
Person p2 = p1;           // 同じ Person を指す
p2.name = "Suzuki";
System.out.println(p1.name); // Suzuki
Java
  • null の扱い: 参照型の未初期化は null(何も指していない)。null に対してメソッドを呼ぶと NullPointerException。
  • new の必要性: String のリテラルを除き、配列・自作クラス・多くの標準クラスは new で実体を作る。

初期化のコツと落とし穴

  • ローカル vs フィールド:
    • ローカル変数: 使う前に代入必須(未代入はコンパイルエラー)。
    • フィールド: 自動的に初期値(プリミティブは 0 系、参照型は null)が入るが、必要ならコンストラクタで明示初期化。
  • var(型推論・Java 10+):
var count = 1;        // int と推論
var msg = "hi";       // String と推論
// var はローカル変数のみ。可読性が落ちるなら使わない選択もOK。
Java
  • final(再代入禁止):
final int MAX = 100;     // 定数っぽく使う
// MAX = 200; // コンパイルエラー
Java
  • ラッパー型とオートボクシング:
    • ラッパー型: Integer, Long, Double, Boolean など(参照型)。コレクションでプリミティブを扱う時に使う。
    • オートボクシング/アンボクシング: int ⇄ Integer の自動変換。null の Integer をアンボクシングすると例外に注意。
  • コピーの誤解:
    • プリミティブの代入は値のコピー。
    • 参照型の代入は参照のコピー(同じオブジェクトを指す)。独立させたいなら“ディープコピー”を作る。
  • 文字列の結合効率:
    • 繰り返し結合は StringBuilder を使うと効率的。
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 3; i++) sb.append(i).append(",");
String result = sb.toString(); // "0,1,2,"
Java

コードテンプレート集(初心者向け)

1. 変数宣言・初期化の基本形

int count = 0;
double rate = 1.5;
boolean ok = false;
char letter = 'J';
String title = "Java入門";
Java

2. 配列の初期化パターン

// 長さだけ
int[] nums = new int[3]; // {0,0,0}

// 値を並べる
int[] points = {10, 20, 30};

// 2次元配列
int[][] grid = {
    {1, 2},
    {3, 4}
};
Java

3. クラスとフィールドの初期化

class Account {
    String owner;  // 参照型フィールド(デフォルトは null)
    int balance;   // プリミティブフィールド(デフォルトは 0)

    Account(String owner, int initial) { // コンストラクタで明示初期化
        this.owner = owner;
        this.balance = initial;
    }
}

Account a = new Account("Sato", 500);
Java

4. 安全な参照チェック(null回避)

String s = null;
if (s != null && s.length() > 0) {
    System.out.println("長さ: " + s.length());
} else {
    System.out.println("未設定です");
}
Java

5. ラッパー型とコレクション

import java.util.ArrayList;
import java.util.List;

List<Integer> list = new ArrayList<>();
list.add(10);         // int → Integer に自動変換
Integer x = list.get(0);
Java

例題で身につける(解説つき)

例題1: 参照の共有を体感する

  • ねらい: プリミティブと参照型の“コピーの違い”を理解する。
  • やること: 下のコードの出力を予想してから、実行して確認。
int a = 5;
int b = a;
b = 9;
System.out.println(a); // ?

int[] arr = {1, 2};
int[] arr2 = arr;
arr2[0] = 99;
System.out.println(arr[0]); // ?
Java
  • ポイント:
    • プリミティブ: a は 5 のまま。
    • 参照型: arr と arr2 は同じ配列を参照しているため、両方に 99 が見える。

例題2: null を避ける初期化

  • ねらい: 参照型の初期化を習慣化する。
  • やること: Person を安全に生成して使う。
class Person {
    String name;
    Person(String name) { this.name = name; }
}

Person p = new Person("Yamada");
if (p != null && p.name != null) {
    System.out.println(p.name.toUpperCase());
}
Java
  • ポイント: コンストラクタで必須フィールドを受け取ると、null チェックの手間が減る。

例題3: String と StringBuilder の違い

  • ねらい: 文字列の結合効率を体験。
  • やること: 100回の結合を両方式で試す(処理時間をざっくり比較)。
// 非効率になりがち
String s = "";
for (int i = 0; i < 100; i++) {
    s += i;
}

// 効率的
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; i++) {
    sb.append(i);
}
String t = sb.toString();
Java
  • ポイント: 繰り返し結合は StringBuilder。たまの結合なら String でもOK。

次の一歩

  • 練習の提案:
    • 配列のコピー: System.arraycopy と Arrays.copyOf を使って“別物”を作る。
    • ラッパー型の落とし穴: List<Integer> に null を入れて取り出すとどうなるか試す。
    • final の使い分け: 参照を final にしても“中身の変更”は可能か検証(例: final int[])。

タイトルとURLをコピーしました