こんにちは、現役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のスコープ内なのでエラーにならない
}