Java言語を使用してプログラミングする際、絶対といっていいほど「変数」の定義をします。しかし、定義をしてしまえばどこからでも使えるというわけではありません。変数にはスコープ(有効範囲)というものが存在します。

スコープ(有効範囲)とは

変数のスコープ(有効範囲)とは、文字通り定義した変数の有効な範囲の事です。
スコープを意識しないでプログラミングすると、エラーが発生する可能性があるだけでなく、思わぬ所で変数に値の代入が出来てしまい想定外の動きになってしまうなどの問題が発生しかねません。
簡単な例を用いながらスコープについて見ていきましょう。
例1)変数x1のスコープ(正常パターン)

7行目に変数x1を定義しているので、7行目以降からmainメソッドの終わりまでがx1のスコープとなります。(今回の例では、22行目がmainメソッドの終わり)
値の代入や出力(System.out.println)でx1にアクセスしていますが、スコープ内なので問題なく実行されます。
ちなみにこのプログラムを実行すると、出力結果は上から順に「1,2,20」となります。
例2)変数x1のスコープ(エラーパターン)

ここにjavaフォルダの画像「cap_02」が入ります。
例1と同じように7行目で変数x1を定義していますが、先ほどとはスコープが全く違います。
先ほどはmain以外のブロック(中括弧で囲まれた文)の中に入る事なく定義されていたので、定義した以降からmainメソッドの終わりまでがx1のスコープとなっていました。
しかし今回はmainメソッド内のif文内で定義されているので、x1のスコープは7行目以降からif文の終わりまでがスコープとなります(今回の例では、13行目がif文の終わり)
図を見てもらうとわかるようにif文内でx1へのアクセスするのは問題ありませんが、if文外でx1へアクセスしようとするとエラーとなっています。(15,17,19行目)
例3)変数z1のスコープ(想定外の動き)

今回注目したいのは4行目で定義されている変数z1です。
6行目からのmainメソッド内からz1にアクセスする事も出来ますし、26行目から定義しているsubMethod1メソッド内からでもアクセスすることが出来ます。
こう見てしまうと、「広範囲からアクセス出来て便利だ」「スコープが広い方が何かと得なのでは?」と思うかもしれませんが、問題もあります。
subMethod1メソッドは、コメントでも補足してあるように引数に10を掛けた値を、このメソッド内で定義した変数z2に一旦代入し、それを返そうとする事を目的としたメソッドです。
しかし、31行目に注目してください。引数に10掛けた値を変数z2ではなく変数z1に
代入してしまっています。本来動作させたい内容と全然違いますが、エラーは発生しません。
つまり、
変数z1のスコープが広いため広範囲からアクセス可能になった弊害で、本来記述したいメソッドの内容とは全く違ってはいるものの、エラーも起きないためこのように記述できてしまうのです。
エラーが発生しているならどこが問題かわかりやすいですが、エラーが発生していないので問題に気づきにくい分、より質がわるいかもしれません。
ちなみにこの例での出力結果は、上から順に「1,0,10」です。

まとめ

スコープが広い変数(グローバル変数)を多用すると意図しない動作が発生してしまいます。綺麗なコードを書くにはなるべく変数のスコープを狭くする事が有効といえるでしょう。
ただ、スコープを意識しすぎてグローバル変数を全く使わないと、それはそれで使い勝手が悪くなってしまいます。
どこにどのような変数を定義すると使い勝手が良くなるかを考えながら、プログラミングするといいでしょう。
おすすめ記事
人気No.1言語!Javaを学べるプログラミングスクール
一番人気の言語Javaを勉強できる学習サイト8選
Javaの本・参考書の評判