■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の中身が書き換わってしまう.