【Javaの基礎】変数のスコープ(ローカル変数)

 

こんにちは、現役SEの「とも」です。

今回は、ローカル変数のスコープについて書きたいと思います。

スコープとは有効範囲のことで、変数が使える範囲の説明になります。

 

ローカル変数とは、メソッド内に定義する変数のことを言います。

他には、クラス変数やグローバル変数がありますが、必要に応じて別途記事を作りたいと思います。

 

ローカル変数は、定義する場所によって変数を使える範囲が異なります

初学者にとっては、変数のスコープは分かりにくいトピックですが、プログラムを理解するにあたって重要なことなので、しっかりと理解しておくと良いです。

 

具体的な例を見ていきましょう。

 

ローカル変数のスコープ

 
public static void main(String[] args) {
  int xx = 1;
  int a = 1;             // aを使用可能
  if( a == 1){           // aを使用可能
    int b = 2;           // aを使用可能  bを使用可能
    // 処理              // aを使用可能  bを使用可能
  }                      // aを使用可能
}
	

 

基本的な考え方としては、

  • 変数を定義した直後から、定義された場所の”}”(中括弧)が閉じるまで

が、変数を参照できる範囲です。

ちょっと言葉だと分かりにくいですが、上の例を見ると言いたいことが分かってもらえると思います。

 

そのため、以下のような書き方ができます。

※通常このような書き方はしませんが、スコープについて正しく知るために書いています。

 
public static void main(String[] args) {
  int a=1; System.out.println(a);      // 定義した行で使う
  if( a == 1){
    int b = 2;
    System.out.println(b);}               // 使った行で中括弧を閉じる
}
	

 

以下の記載はエラーになります。

 
public static void main(String[] args) {
  System.out.println(a);      // aを定義前にaを使う
  int a=1;
  if( a == 1){
    int b = 2;
  }
  System.out.println(b);     // スコープ外でbを使う
}
	

 

また、以下のようにスコープが違った場合でも、同じローカル変数を使用するとエラーになります。

※他の言語ではスコープが違う場合に同じ変数名で上書きできるものがありますが、javaでは厳格化されていて使用できないようです。

 
public static void main(String[] args) {
  int a=1;
  if( a == 1){
    int a = 2;                // ローカル変数の重複でエラー
  }
}
	

 

for文のスコープ

ちなみに、少し分かりにくいものとしてfor文のスコープがあります。

 
public static void main(String[] args) {
  for( int i = 0; i < 10 ;i++){
    // 処理
  }
}
	

 

forのカッコの中で「int i = 0;」が定義されていますね。

この場合、

 
  for( int i = 0; i < 10 ;i++){
    // 処理
  }
	

の範囲が、「i」を使用できる範囲になります。

以下は「i」のスコープ外となります。

 
public static void main(String[] args) {
  for( int i = 0; i < 10 ;i++){
    // 処理
  }
  System.out.println(i);     // iのスコープ外なのでエラー
}
	

 

もし、for文の外で「i」を使用したい場合は、以下のように書きます。

 
public static void main(String[] args) {
  int i;           // 定義を外に出す
  for( i = 0; i < 10 ;i++){
    // 処理
  }
  System.out.println(i);     // iのスコープ内なのでエラーにならない
}