Java 速習チュートリアル

Java のスコープ

Javaにおいて、変数はそれが作成された領域内でのみアクセス可能です。この変数が有効な範囲のことをスコープ(Scope)と呼びます。

変数をどこで宣言するかによって、その変数の「寿命」と「見える範囲」が決まります。

1. メソッドスコープ (Method Scope)

メソッドの内部で直接宣言された変数は、そのメソッド内の宣言された行以降であればどこからでも利用できます。

1.1 メソッドスコープのコード例

public class Main {
  public static void main(String[] args) {

    // ここでは変数 x はまだ使えません(エラー)

    int x = 100; // ここで宣言

    // ここからは変数 x を使えます
    System.out.println(x);
  }
}

2. ブロックスコープ (Block Scope)

Javaにおける「ブロック」とは、波括弧 { } で囲まれたコードの集まりを指します。
ブロックの中で宣言された変数は、その波括弧の間で、かつ宣言された行以降のコードからのみアクセス可能です。

2.1 ブロックスコープのコード例

public class Main {
  public static void main(String[] args) {

    // ここでは x は使えません

    { // ここからブロック開始

      // ここでもまだ x は宣言前なので使えません

      int x = 100;

      // ここでは x を使えます
      System.out.println(x);

    } // ここでブロック終了。x は「消滅」します

    // ここではもう x は使えません(エラー)

  }
}

ブロックは単独で作成することもできますが、通常は ifwhilefor ステートメントの一部として現れます。

3. ループスコープ (Loop Scope)

for ループのヘッダー(括弧内)で宣言された変数は、そのループのブロック内でのみ存在します。

3.1 ループ変数の生存期間

public class Main {
  public static void main(String[] args) {

    for (int i = 0; i < 5; i++) {
      // i はこのループ内でのみアクセス可能
      System.out.println(i); 
    }

    // ここでは i にアクセスできません。エラーになります。
  }
}

なぜこれが重要なのか?

  • 名前の再利用: ループ変数はループが終わると破棄されるため、同じメソッド内の別のループで同じ名前(ij など)を安全に再利用できます。
  • メモリの節約: 必要な時だけ変数がメモリを占有し、不要になったらすぐに解放されるため効率的です。

3.2 変数名の再利用の例

for (int i = 0; i < 3; i++) {
  System.out.println("ループ 1: " + i);
}

// 最初の i は消えているので、新しく i を宣言しても衝突しません
for (int i = 0; i < 2; i++) {
  System.out.println("ループ 2: " + i);
}