【プログラミングしてみよう77】Javaのスコープとライフタイム入門

Java

前回はキャストと型変換を学びました。

今回は「スコープ(有効範囲)」と「ライフタイム(生存期間)」について解説します。変数がどこで使えて、いつ消えるかを理解することでバグを防ぎやすくなります。

スコープとは

「スコープ」とは変数が参照できる範囲のことです。{} で囲まれたブロックの中で宣言した変数は、そのブロックの中でしか使えません。

スコープの種類:
ローカル変数   // メソッドやブロックの中
インスタンス変数 // クラスのフィールド(インスタンスに属する)
クラス変数     // static フィールド(クラスに属する)

サンプルコード

ファイル作成

「Java65」フォルダに ScopeTest.java という名前でファイルを作成します

コード入力

public class ScopeTest {
    // クラス変数(static): プログラム全体で1つ
    static int classVar = 0;

    // インスタンス変数: インスタンスごとに存在
    int instanceVar = 0;

    void demonstrateScope() {
        // ローカル変数: このメソッドの中だけ
        int localVar = 10;
        System.out.println("ローカル変数: " + localVar);

        // ブロックスコープ
        if (true) {
            int blockVar = 20; // このif блокの中だけ
            System.out.println("ブロック変数: " + blockVar);
        }
        // System.out.println(blockVar); // エラー: スコープ外

        // ループ変数のスコープ
        for (int i = 0; i < 3; i++) {
            System.out.print(i + " ");
        }
        System.out.println();
        // System.out.println(i); // エラー: ループ外ではiは使えない
    }

    void demonstrateLifetime() {
        // ローカル変数: メソッド呼び出しのたびに新しく作られる
        int count = 0;
        count++;
        System.out.println("count: " + count); // 常に1

        // インスタンス変数: インスタンスが生きている間ずっと保持
        instanceVar++;
        System.out.println("instanceVar: " + instanceVar);

        // クラス変数: プログラムが終わるまで保持
        classVar++;
        System.out.println("classVar: " + classVar);
    }

    // シャドウイング: 外側と同名の変数を内側で宣言する
    void demonstrateShadowing() {
        int x = 10;
        System.out.println("外側のx: " + x);
        {
            int y = 20; // xは再宣言できないのでyを使用
            System.out.println("内側のy: " + y);
            System.out.println("外側のxも見える: " + x);
        }
    }

    public static void main(String[] args) {
        ScopeTest obj1 = new ScopeTest();
        ScopeTest obj2 = new ScopeTest();

        System.out.println("=== スコープのデモ ===");
        obj1.demonstrateScope();

        System.out.println("\n=== ライフタイムのデモ ===");
        obj1.demonstrateLifetime();
        obj1.demonstrateLifetime(); // instanceVarは2になる
        obj2.demonstrateLifetime(); // obj2のinstanceVarは1、classVarは3

        System.out.println("\n=== シャドウイング ===");
        obj1.demonstrateShadowing();
    }
}

コンパイル

javac ScopeTest.java

実行

java ScopeTest

実行結果は次のようになります。

=== スコープのデモ ===
ローカル変数: 10
ブロック変数: 20
0 1 2 

=== ライフタイムのデモ ===
count: 1
instanceVar: 1
classVar: 1
count: 1
instanceVar: 2
classVar: 2
count: 1
instanceVar: 1
classVar: 3

=== シャドウイング ===
外側のx: 10
内側のy: 20
外側のxも見える: 10

スコープ・ライフタイムのまとめ

種類              スコープ          ライフタイム
ローカル変数      ブロック内        メソッド呼び出し中
インスタンス変数   インスタンス内    インスタンスが生きている間
クラス変数        クラス全体        プログラム実行中ずっと

まとめ

スコープを正しく理解することで、変数の意図しない参照や名前の衝突を防げます。変数はできるだけ狭いスコープで宣言するのがベストプラクティスです。ローカル変数・インスタンス変数・クラス変数の違いを意識してコードを書きましょう。

2026/08/25(火) ぱんまる

コメント

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