この章では変数の影響がどこまで及ぶのかを説明します。
変数にはスコープと呼ばれる有効範囲が存在します。
変数は関数の外で作成した変数と、関数内で作成した変数に分けます。
関数外で作成した変数はグローバル変数と呼ばれ、いつでも出力したり呼び出すことができます。
問題なのは関数内で作成した変数です。
これはローカル変数と呼ばれ、その関数内でしか使用することはできません。
また関数内と関数外で同じ変数名があった場合、つまりローカル変数とグローバル変数とが同じ変数名であった場合、関数内で優先されるのはローカル変数です。
では実際に例を見てみましょう。 この例ではわざとグローバル変数のとheikin関数の中のローカル変数gの2つの同じ変数名を用意しました。
関数の中ので出力されるのはローカル変数の99です。
つまりグローバル変数gの値である34よりローカル変数の99の方が優先されます。
結果は以下の通りです。 グローバル変数は関数内でも使用できますので、以下の例を見てください。 先ほどの例からローカル変数のgを削除しました。
その場合はグローバル変数gの値である34が関数内のgで使用されます。
結果は以下の通りです。
タグ: ローカル変数
グローバル変数とローカル変数について知ろう
この章ではグローバル変数とローカル変数について説明します。
詳しい説明は例の後で行います。
では例をみてみましょう。
グローバル変数とは関数の外で宣言された変数のことを言います。
この例で言いますと以下の箇所です。
int a=2
これまではmain関数の中で変数を使用してきましたが、こののように関数の外で宣言をするとグローバル変数になります。
グローバル変数は以下の通りどの関数の中でも使用することが出来ます。 ローカル変数とは関数の中で宣言された変数のことを言います。 ローカル変数は宣言をした関数の中でしか使用することが出来ませんので、複数の関数で同じ変数名を使用しても問題ありません。
つまり、関数の中だけが有効範囲なので、他の関数内で同じ変数名を作成してもお互い別の変数になるという訳です。
この例でいいますとmain関数とtashizan関数の中のローカル変数は同じ名前の変数名を付けても問題ありません。
例えば以下の例のようにmain関数とa関数の中でnumber変数を使用していますが、これらはお互いに影響を受けることはありません。
つまり、同じ変数名でも全く違う変数です。 ではもっと理解を深めるために次の例を見てみましょう。 まず初めにグローバル変数とローカル変数の確認から始めます。
関数の外側で宣言している
int a=23;
int b=25;
はグローバル変数です。
function1関数の中で宣言している変数はローカル変数です。
main関数の中で宣言している変数はローカル変数です。 次は変数の寿命について学習します。 関数の外でグローバル変数としてを宣言していますが、グローバル変数はプログラムが実行されてから終了するまで値を記憶しています。
functionは4つありますが、1回実行される度にグローバル変数はにより1が足されます。 後ほど学習しますがローカル変数はが1回実行される度にクリアされるので値を保持することができません。
次は「static」について説明します。
static int a=0;
関数内でstaticを付けないと、ただのローカル変数になってしまいますがstaticを付けることでグローバル変数と同じ機能を持つことが出来ます。
つまり、プログラムが実行されてから終了するまで値を記憶させておくことが出来ます。
このstaticが付いた変数を静的変数と言います。
functionは4つありますが、1回実行される度に静的変数はにより1が足されます。 これはグローバル変数の挙動とまったく同じです。
次はローカル変数について説明します。
function関数内で宣言されているはローカル変数です。
ローカル変数は関数が実行される度にデータがクリアにされるので情報を保持することはできません。
functionは4つありますが、を1回実行するたびにが実行されて、で1を足されるので、いつまでも1のままです。
結果は以下の通りです。
メソッドについて知ろう
この章ではメソッドについて説明します。
これまでたくさん使ってきたmainメソッドもメソッドの1つなので、mainメソッドの説明から始めます。
これまでmainメソッドは詳しく説明しませんでした。
その理由はプログラムの基礎を理解していないとメソッドの説明はできないからです。
ではmainメソッドについて説明します。
mainメソッドは以下の通り定義します。 Javaのプログラムはmainメソッドから始まる決まりになっています。
mainは他の名前で代用することができませんので、必ず必要な名前になります。
publicはクラスの外からのアクセスすることができることを意味します。
publicについては「クラスについて知ろう」の章で説明します。
つまり、publicの付いたメソッドはどこからでも利用することが出来ると言うことです。
staticは クラスのオブジェクトを作ることなくアクセスすることができると言う意味です。
staticについては「staticについて知ろう」の章で、オブジェクトについては「クラスについて知ろう」の章で詳しく説明します。
String args[]はコマンドラインで入力した時に、この場所に引数というデータを入れることが出来るのですが、String args[]という形式なので文字列の配列が入ります。
ここはStringしか定義できません。
つまり、int型にしたりはできません。
コマンドライン入力については「コマンドライン入力について知ろう」の章で説明します。
voidはメソッドが戻り値を返す必要が無い時に使います。
voidも戻り値も後で詳しく説明します。
mainメソッドはプログラムの中で最初に実行され、戻り値を返す必要がないので、voidになっています。
mainメソッドは必ず書かなくてはいけないメソッドなので、少し特殊ですが、他にもメソッドは自身で作ることが出来ます。
メソッドとは与えたデータ(引数)に基づいて決められた処理を行い、戻り値を返す機能を持っています。
例えば消費税を自動で計算するメソッドを自分で作りたいとします。
その場合、メソッドは商品金額に消費税率を掛けた処理をして、その結果を返すという機能を持ったメソッドを作ることになります。
もう一例挙げます。
エクセルをご存知の方はわかると思いますが、エクセル関数にSUMと言う関数が有りますが、この関数は指定した範囲のデータに基づいて足し算を行う関数です。
例えば指定した範囲のデータが3,5,7であるならば結果は15です。
このSUM関数のような機能を自身でメソッドに書いていきます。
では実際に例を見てみましょう。
初めにメソッドを使わない例を作成して、メソッドの例と較べます。 この例は3つの数字の平均を求める記述を行なっていますが、このように何度も同じ処理を書くのは面倒ですし、3つの数字の平均ではなく、3つの数字の合計を求める仕様に変更となったときに、変更点のすべてを書き直さなくてはいけません。
この例はまだ短いプログラムなのでいいですが、これが何百行あった時にすべて書き直すことは大変な作業になります。
このような時にメソッドを使うと便利です。
では、先ほどの例をメソッドを使って書き直します。
何度も同じ動きをする文を1つにまとめると言うのがメソッドの役割の一つです。
メソッドを使わない例では3か所あった同じ処理を以下のようなメソッドを使うと1箇所で済みます。
同じ文を何回も書かなくてもいいので、プログラムの可読性が良くなります。ではメソッドの作り方について説明します。メソッドを作成する基本形は以下の通りです。 メソッドの基本構文の詳細はこの後すぐに説明しますので今は形だけを覚えておいてください。
スペースの都合での部分が2行目に書かれていますが、通常はこの例のようにメソッド名の横に書いてください。
また、の部分を「仮引数」と言いますが、引数とはメソッド内で使われるデータです。
そして、このメソッドを実行したい時には のように記述すればheikinメソッドを呼び出して実行することが出来ます。
つまり、以下の基本構文でメソッド内の内容を実行します。 引数とはメソッドに渡すデータの事ですが、引数が複数ある場合にはのようにを使って、データ間を区切ります。
このメソッドの呼び出しのカッコの中にあるデータ を「実引数」と言います。
実引数は別に変数である必要はなく、のようなリテラルでも問題ありません。
リテラルとは「99」や「”猫”」のようなデータそのものを意味します。
では先ほどの例でメソッドの流れについて説明します
実引数のxの値はメソッド本体のにセットされ、yの値はに、zの値はにセットされることになります。
このように変数の値を渡すことを値渡しと言います。
そして、そのセットされた変数は実際のメソッドの中で使われることになります。 また、実引数と仮引数の変数名が一致していなくても問題ありません。
ここで注意点して欲しいことがあるのですが、実引数と仮引数の型と順番と数は一致させてください。
例えば次のような引数の数の不一致はいけません。 そして、仮引数がint型で実引数がString型と言うような型の不一致もできません。
しかし、仮引数と実引数の型が違っても、以下のように小さい型の実引数から大きい型の仮引数への自動変換は出来ます。 この例の場合はint型の99と96をdouble型のに自動変換してくれます。
次にメソッドの利点について説明します。
メソッドを作成する便利な点は例えば3つの数字の平均を求めるメソッドから3つの数字の合計を求めるメソッドにプログラムを変更する際にも以下のようにメソッドの一部分を変えるだけで簡単に変更できるということです。
次にメソッドの基本構文について詳しく説明します。 〇アクセスレベルとは 変数やメソッドに対してどのような場所からアクセスすることが可能であるかを指定することですが、ここではpublicを指定しています。
publicとはどこからでもアクセス可能であると覚えておいてください。
他にもprivateやprotectedなどを指定できますがpublicも含めてクラスの章で詳しく説明します。
static修飾子については「staticについて知ろう」の章で説明します。
〇戻り値型とはメソッドの実行結果を次の例で説明するreturnで呼び出し側に戻すことができるのですが、その戻す値のデータ型を記述します。
戻す値がない時はvoidを指定します。
〇メソッド名はshowTemperatureのように小文字から始まり、単語の区切り目は大文字であることが慣習になっています。
このように書かなくてもエラーにはならないので、自身で解りやすい名前を付けましょう。
またメソッド名にはgetとかshowとか動詞が使われることが多いです。
次はメソッドを実行した時に発生した値を呼び出し元に返す方法について説明します。
例を見てみましょう 値を呼び出し元に返す構文は次の通りです。
先ほど説明したメソッドの例と違うところはreturnがあるか、無いかの違いです。 計算結果を呼び出し元に返したい時にはという形式で書きます。
戻り値とは文字通り、呼び出し元に返したいデータです。
この例ではと書いています。
このreturnで返す戻り値がどの型なのかを指定するのが基本構文の「戻り値型」です。
この例では返す値がint型なので「戻り値型」もintになっています。
戻り値を返さないのであればvoidと書きます。 戻り値である変数dは呼び出し元に戻って、変数gに代入されます。 上の例は結果を変数に入れて、returnで返していますが、以下の例のようにreturnに直接、式を書いて返してもいいです。 このような変数をローカル変数と言います。
例えばheikinメソッドのa,b,c,dの変数はheikinメソッド内でしか使用することは出来ません。
ですので、他のメソッドでa,b,c,dの変数名を使用しても、まったく別の変数になるので問題ありません。
この例でもmainメソッドとheikinメソッドでは同じ変数名a,b,cが使われていますが、全く問題ありません。
では次に進みます。
これまではmainメソッドから他のメソッドを呼び出していましたが、mainメソッド以外のメソッドから他のメソッドを呼び出すことも出来ますので、次の例を見てください。 この例ではmainメソッドからmenseki1メソッドを呼び出していますが、さらにmenseki1メソッドから、menseki2メソッドを呼び出しています。
このような呼び出し方も出来るので覚えておいてください。
では説明を始めます。
mainメソッドの中でmenseki1メソッドを呼び出しています。
menseki1メソッド内ではの結果をに代入しています。
さらにmenseki1メソッド内でmenseki2メソッドを呼び出してに結果を代入しています。
最後にdとeを足したものをfに代入して、その値をreturnで呼び出し元に返して変数gに入れています。
結果は以下の通りです。
次は配列をメソッドに渡す方法について説明します。
では例をみてみましょう。 このメソッドは配列の要素の中で一番大きい数の値を求めるメソッドです。
〇配列をmaxメソッドに渡すにはのように引数に配列を書きます。
〇配列を渡しているのでメソッドの仮引数はのように配列で受け取ります。
〇比べるための一番初めの基準の数値はなのでの値である2になります。
そして、for文の中で以下のような順番でループして大きさを比べています。
1周目のはとなり、の方が大きいのでtop1には1が入ります。
2周目のはとなり、の方が大きいのでtop1には2が入ります。
3周目のはとなり、の方が大きいのでtop1には3が入ります。
4周目のはとなり、の方が大きいのでtop1には4が入ります。
5周目のはとなり、の方が大きいのでtop1には5が入ります。
最終的にtop1には5が入ります。
そして、の箇所でtop1の値がworld1に代入されます。
number[world1]のworld1には一番大きい配列のインデックス番号が入っているので、となり、89が出力されます。
次の例は配列の要素をメソッドに渡して、その値をメソッド内で変更した時に元の配列はどうなるかについて説明します。 結果は「444444」です。
配列をメソッドに渡すときには値渡しではなく、参照渡しになります。
変数をメソッドに渡す場合は値渡しです。
呼び出し元の配列numberをrt配列に渡していますが、このrt配列をkakikaeメソッド内で変更するとnumber配列の値まで書き替えることができます。
これが参照渡しになります。
変数を渡す値渡しの場合はメソッド側でその変数の値を書き替えることが出来ません。
例ではnumber配列の要素であるをkakikaeメソッドの中のrt配列に渡してすべて4を代入していますが、このようにメソッド側で配列の値を変えることで、呼び出し元の配列の要素もすべてに変更されます。
次の例では呼び出し元の変数をメソッド側で書き替えることができるか(書き替えることは出来ませんが)見てみましょう。 kakikae(x,y,z);の箇所で引数をkakikaeメソッドに送っています。
これは値渡しで渡しています。
そして、kakikaeメソッドで以下のように4を代入しています。
a=4;
b=4;
c=4;
ここで変数に4を代入しても、呼び出し元のx 、y、z の値は変更されずのままです。
つまり、値渡しの場合はメソッド側でその変数の値を書き替えることが出来ません。 その場合には呼び出し側の引数もカラにしてメソッドを呼び出します。
グローバル変数とローカル変数について知ろう
この章ではグローバル変数とローカル変数について説明します。
詳しい説明は例の後に行います。
では例をみてみましょう。 グローバル変数とは関数の外で宣言された変数のことを言います。
この例で言いますとがグローバル変数です。
これまではmain関数の中で変数を使用してきましたが、このaのように関数の外で宣言をするとグローバル変数になります。
グローバル変数は以下の通り、どの関数の中でも使用することが出来ます。
次にローカル変数について説明します。
ローカル変数とは関数の中で宣言された変数のことを言います。 ローカル変数は宣言をした関数の中でしか使用することができませんので、複数の関数で同じ変数名を使用しても問題ありません。
この例であればmain関数とtashizan関数の中のローカル変数は同じ名前の変数名を付けてもいいです。
例えば以下の例のようにmain関数とa関数の中でnumber変数を使用していますが、これらはお互いに影響を受けることはありません。
つまり、同じ変数名でも全く違う変数です。 ではもっと理解を深めるために次の例を見てみましょう。
初めにグローバル変数とローカル変数の確認から始めます。 function1関数の中で宣言している変数はローカル変数です。
main関数の中で宣言している変数はローカル変数です。 初めに、main関数内のローカル変数がprintfで出力されて,3と4が出力されます。
ローカル変数の有効範囲は宣言をした関数の中だけです。
次は変数の寿命について説明します。関数の外でグローバル変数であるを宣言していますが、グローバル変数はプログラムが実行されてから終了するまで値を記憶しています。 後ほど説明しますがローカル変数はが1回実行される度にクリアされるので値を保持することができません。
次はstaticについて説明します。
static int a=0;
関数内で変数にstaticを付けないと、ただのローカル変数になってしまいますが、staticを付けることでグローバル変数と同じ機能を持つことが出来ます。
つまり、プログラムが実行されてから終了するまで値を記憶させておくことが出来ます。
このstaticが付いた変数を「静的変数」と言います。
functionは4つありますが、1回実行される度に静的変数はにより1が足されます。 結果、 は値が1つずつ増えて「1,2,3,4」となります。
次はローカル変数について説明します。
function関数内で宣言されているはローカル変数です。
ローカル変数は関数が実行される度にデータがクリアにされるので情報を保持することはできません。 結果は以下の通りです。