ローカル変数のスコープ - 萌えJava超入門
第十三章 変数とスコープ

ローカル変数のスコープ

メソッドの中で宣言した変数をローカル変数といいます。
ローカル変数のスコープはメソッドの中だけです。

目次


1.ローカル変数とは

メソッドの中で宣言した変数を「ローカル変数」といいます。
これに対して、メソッドの外(classの中)で宣言した変数を「メンバ変数」といいます。
ここまで使ってきた変数は
すべてローカル変数だ。
mainメソッドや、別に作ったメソッドの中
だったからな。
なるほど。
このページではローカル変数のスコープを
説明をしていきたい。


2.スコープとは


変数には有効範囲があって、その範囲の外から変数を参照することはできません。
この変数の有効範囲をスコープといいます。
スコープは、変数を宣言した場所で決定します。
宣言したあとで、変数のスコープを変更することはできません。



3.ローカル変数のスコープ


ローカル変数のスコープ
変数が宣言された場所から「」(閉じ波カッコ)までがスコープです。

//Sample08_001.java
class Sample08_001{

    public static void main(String[] args){
int value = 100; value *= 1.1; System.out.println("value * 1.1= " + value);
}//スコープはここまで。 }
青い部分が valueのスコープです。

コマンドライン
>javac Sample08_001.java
>java Sample08_001
value * 1.1= 110

範囲が決まってたんですね。



mainメソッドだけ扱っている間は
「宣言以降がスコープ」で良かったが、
他のメソッドも使うようになったから
スコープを気にしなければならなくなった。
」(閉じ波カッコ)が目印ね。



↓の Sample08_002NGは、変数 valueを method_01で宣言しました。
つまり、value は method_01のローカル変数ということになります。
この為、valueのスコープは method_01内に限られます。
他のメソッド(例えばmainメソッド)からは参照できません。

//Sample08_002NG.java
class Sample08_002NG{

    static void method_01(){
int value = 100; value *= 1.1;
}//スコープはここまで。 public static void main(String[] args){ System.out.println("value * 1.1= " + value); } }

コマンドライン
>javac Sample08_002NG.java
Sample08_002NG.java:9: エラー: シンボルを見つけられません
        System.out.println("value * 1.1= " + value);
                                             ^
  シンボル:   変数 value
  場所: クラス Sample08_002NG
エラー1個


エラーになってしまいました。
mainメソッドの中から参照できる範囲に「value」が見つからなかったのです。

あれ?
メソッドの結果を
mainメソッドに渡すのって
どうすればいいんスか?
戻り値を利用するといい。



ここで引数と戻り値かぁ!


4.ローカル変数の値の受け渡し


↓の Sample08_003では、int変数 valueを method_02の引数として宣言しました。
この valueは、method_02のローカル変数として扱われます。
valueのスコープは method_02内に限られます。

valueの値を mainメソッドに返すためには、method_02の戻り値を利用します。

メソッドの引数はそのメソッドのローカル変数です。

↓の例では method_02メソッドの value
ローカル変数になる。
//Sample08_003.java
class Sample08_003{

    static int method_02(int value){//valueは、method_02のローカル変数
value *= 1.1; return value;
}//スコープはここまで。 public static void main(String[] args){ int arg = 100;
int anser = method_02(arg); System.out.println(arg + " * 1.1= " + anser);
}//スコープはここまで。 }

コマンドライン
>javac Sample08_003.java
>java Sample08_003
100 * 1.1= 110

class Sample08_003の解説
  1. 初めに mainメソッドが実行されます。
  2. method_02メソッドに、引数 argを与えています。
  3. 引数 argの値は、method_02の変数 valueに代入されます。
  4. method_02で、valueの値は1.1倍になって、returnによって mainメソッドに返されます。
  5. 同時に mainメソッドでは、戻り値を変数 anserで受け取ります。
  6. 最後に anserの値を表示しました。

mainメソッドからmethod_02の中の変数にアクセスすることは一切できません。
引数を与えて、戻り値を得るだけです。

ローカル変数の値の受け渡し
ローカル変数のスコープは、宣言したメソッドの中に限られます。
他のメソッドへの受け渡しには、メソッドの引数戻り値を利用します。

ローカル変数のスコープは
あえて限定されている。
プログラマにとってその方が都合がいいからだ。
どうゆうこと?



変数名の重複や取り違えによるトラブルを
避けているんだ。
ふ~ん。



もう少し説明を続けますね。

お疲れ様でした。




© 2019 awasekagami