■Javaの関数■
関数とは
数学での関数ではなく,ひとまとまりの処理を「関数」と呼ぶ.C言語と同様のものである.一般的にはサブルーチンとも呼ばれる.
関数の使用例
関数を使った実際のプログラム例は次のようになる.
public class Example { public static void main(String[] args) { ...mainの中身... int x = square(3); //関数squareの呼出 ...mainの中身続き... } public static int square(int param) //関数squareの本体 { int value; value = param * param; return value; } }
実は,mainも関数のひとつである.この例ではclass Exampleの中にmainの他に関数squareが存在している.そしてmainの中で,そのsquareを呼び出している.
関数呼出
この例では,squareはある数の二乗を計算する関数である.このsquareを利用して「3」の二乗を計算するには,次のように書く.
int x = square(3); ↑実引数(squareに計算してもらうために渡すデータ) ↑返値(squareが計算してくれた結果)がxへ代入
関数名に小括弧を付けて記述すると,その場所で関数の中身が実行される.これを関数を呼び出すと表現する.括弧の中の「3」は,実際にどういう値の二乗を計算して欲しいのかを関数squareに伝えるためのもので,実引数と呼ぶ.
また,関数の計算結果のことを返値と呼ぶ.この例では変数xに返値として32=9が代入される.
関数本体
各関数の中身は,mainのときと同様にif文やfor文などを自由に使ってプログラムする.しかし,実引数を受け取ってからでないと,実際の計算処理が開始できない.先の例では「3」の二乗を計算すればよかったが,かといって「3」だけを計算するプログラムを書くわけにもいかない.当然「square(5)」や「square(11)」などのように別の実引数で呼び出されることもある.
そこで,関数の本体では括弧の中に仮引数を用意する.関数squareの場合には次のようになる.
public static int square(int param) ←仮引数の宣言 { int value; value = param * param; ←仮引数を使って計算 return value;←計算結果を返す }
public static の意味はまだ後で説明する.
この例ではparamが仮引数で,呼び出されたときの実引数を受け取るための変数になる.関数が呼び出されたとき,この例では自動的にparamに3が代入されてから関数squareの実行が開始される.squareの中ではそのparamの二乗値を計算してその結果をreturnで返している.
動作の流れ
x = square(3); ↓ param=3: 仮引数paramに実引数「3」を代入 ↓ value = param * param; :valueに「3 * 3」( = 9 )を代入 return value; :valueを返す ↓ 返値=value: 返値に9を代入
青く示した部分が自動的に行われ,最後に返値に格納されていた9がxに代入される.
変数を使った関数呼び出し
実引数には,数値データだけでなく,変数や計算式を書くこともできる.また,関数の中から別の関数を呼び出すこともできる.
例えばint hoge = なにか計算式; int x = funcA( hoge ); int y = funcA( hoge * 2 + 10 ); int z = funcA( funcB( -6.6 ) );
引数が複数あった場合
引数が複数ある場合には,単純に対応する実引数を並べて書けばよい.ただし,呼び出す関数が必要とする仮引数と同じ順番に同じ型のデータを並べないといけない.
int x = funcB( 100, -60, 78.66);
この場合,関数本体は次のようになっているはずである.
int funcB(int p1, int p2, double p3) { }
引数が一つもない場合
仮引数が一つもない場合には,空括弧のまま呼び出せばよい.
x = funcC();
この場合の関数本体も同様である.
返値の型 funcC() { }
返値がない場合
返値がない場合には,結果を受け取る必要がない.
funcD(180);
この場合には,関数本体の方には返値の型としてvoidを指定する.
public static void funcD(int param) { return; //returnの後ろに何も指定せず,何も値を返さない }
引数が配列の場合
引数が配列だった場合には,注意が必要である.
public static void main(String[] args) { int[] array = new int[3]; funcE( arary ); } public static void funcE( int[] param) { param[0] = 1; param[1] = 100; param[2] = 101; }
この例では,array[0]やarray[1]ではなく,arrayという配列名だけを関数の引数にして呼び出している.つまり配列全体を引数に渡しているといえる.実は,配列のところで説明したが,配列名はデータのアドレスを示している.このため仮引数paramに渡されてくるのは配列のアドレスであり,元の配列と同じメモリアドレスを参照することになる.このため,このプログラムを実行すると,mainの変数のarrayの中身が書き換わってしまう.