前回はキャストと型変換を学びました。
今回は「スコープ(有効範囲)」と「ライフタイム(生存期間)」について解説します。変数がどこで使えて、いつ消えるかを理解することでバグを防ぎやすくなります。
スコープとは
「スコープ」とは変数が参照できる範囲のことです。{} で囲まれたブロックの中で宣言した変数は、そのブロックの中でしか使えません。
スコープの種類:
ローカル変数 // メソッドやブロックの中
インスタンス変数 // クラスのフィールド(インスタンスに属する)
クラス変数 // 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(火) ぱんまる


コメント