Developer

【はじめてのJava】ローカル変数のスコープの注意点【オブジェクトとクラス編】
2021.10.31
Lv1

【はじめてのJava】ローカル変数のスコープの注意点【オブジェクトとクラス編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


オブジェクトとクラス編

オブジェクトとクラス編では、Javaを扱う上で非常によく出てくる「オブジェクト」や「クラス」について扱っていきます。

前回は「ローカル変数のスコープ」について扱いました。

今回は「ローカル変数のスコープの注意点」について紹介します。


目次


変数のスコープ

 変数のスコープ とはその変数を利用可能な範囲のことです。

変数は宣言したからと言ってすべての箇所で使えるわけではありません。

また、ローカル変数については、同じ変数という名前がついている「インスタンス変数」「static変数」とは大きく異なるものです。
ローカル変数のスコープを考える際には、インスタンス変数やstatic変数と異なる視点で考える必要があります。

詳しく見ていきましょう。


ローカル変数のスコープの注意点

ローカル変数は宣言されたブロック内でのみ利用可能な変数です。ですので、 宣言されたブロックが終わると利用できません 

これが原因でコンパイルエラーになる場合がよくあります。具体例を見てみましょう。


for文内で宣言したローカル変数

下記のように、for文の定義時に一緒に定義された変数iはローカル変数です。

String message = "hello";
for(int i = 1; i <= 10; i++){ //iはローカル変数
  System.out.println(i + message); //1hello 2hello ...と表示される
}

このとき、iがローカル変数ということは、iはfor文のブロックの外では使えないということになります。

以下のように、for文定義時に宣言したローカル変数iを、for文終了後に利用しようとすると コンパイルエラー です。

for文の場合の例

class Sample{
  void method(){
    String message = "hello";
    for(int i = 1; i <= 10; i++){
      System.out.println(i + message); //1hello 2hello ...と表示される
    }
    
    System.out.println(message); //OK
    //↓iはfor文内で宣言されているのでfor文が終わると使えない。
    System.out.println(i); //NG。コンパイルエラー。
  }
}

if文内で宣言したローカル変数

if文の中で宣言した変数も、ローカル変数です。

boolean isDataCollect = true;

if(isDataCollect){
  int count = 0; //if文のブロック内で宣言されたローカル変数。
  count++;
}

上記の例の場合、countはif文のブロックの外では使えないということになります。

以下のように、if文で定義したローカル変数countをif文の外で利用しようとすると コンパイルエラー です。

if文の場合の例

class Sample{

  void method(){

    boolean isDataCollect = true;

    if(isDataCollect){
      int count = 0; //if文の中で変数宣言。
      count++;
    }else{
      //↓if文のブロックで宣言しているので、elseブロックでは利用不可。
      count--; //NG。コンパイルエラー。
    }

    //↓if文のブロックで宣言しているので、if文外では利用不可。
    System.out.println(count); //NG。コンパイルエラー。
  }
}

if文の外でも利用したい値がある場合は、if文の外で先に宣言しておきます。

class Sample{

  //OKな例
  void method(){

    int count = 0; //先に宣言しておく
    boolean isDataCollect = true;

    if(isDataCollect){
      count++;
    }else{
      count--; //OK
    }

    System.out.println(count); //OK
  }
}


まとめ

ローカル変数は宣言されたブロックの外では使えない
ローカル変数が宣言されたメソッド内でも、宣言されたブロックの外では使えない
(例:for文内で宣言されたiはfor文の外では使えない)


はじめてのJavaシリーズの目次はこちら
オブジェクトとクラス編はこちら


java 11 の練習問題一覧はこちら
はじめてのJavaシリーズの練習問題一覧はこちら