この章ではメソッドについて説明します。
これまでたくさん使ってきた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 の値は変更されずのままです。
つまり、値渡しの場合はメソッド側でその変数の値を書き替えることが出来ません。 その場合には呼び出し側の引数もカラにしてメソッドを呼び出します。