戻る

メソッドの定義

   これまで作成してきたアプリケーションは、mainという名前のただ1つのメソッドしか使ってこなかった。
  これから1つの;クラスの中に複数のメソッドを定義し、それを利用する方法を説明する。

複数のメソッドを定義する

   まずは、mainメソッドの定義から復習する。mainメソッドは、次のように書いてきた。

   public static void main(String[ ] args) {
    文1
    文2
    …
   }

   mainメソッドはこのように定義する。他のメソッドについても同様である。次のように定義する事ができる。

   public static void メソッド名 ( ) { ・・・下線部にメソッドの名前を書く。
    文1
    文2
    …
   }

   ここで注意したいのがメソッドの後ろの( )である。
  mainメソッドの場合は( )の中にString[ ] argsを書いたが、ここでは( )の中を空にしている。
   メソッド名の後ろの( )の中には、そのメソッドが受け取る引数を書く。
  しかし、しばらくは引数を取らないメソッドを書いていくので、その間は( )の中を空のままにしておく。「
  空の( )は、そのメソッドが引数を取らない事を意味している。
   次にbeerという名前のメソッド定義例を示す。

   public static void beer ( ) {
    文1
    文2
    …
   }

   次はmain以外にbeer、wineの合計3つのメソッドを定義したサンプルアプリケーションである。
  各メソッドは、自分のメソッド名を表示するようにプログラムされている。

    サンプル:Beer.java

   //
   //Beer.java---複数のメソッドを定義する
   //
   public class Beer {
    public static void beer( ) { ・・・・・・・・・・・・・・・・メソッド1:beerの定義
     System.out.println("method: beer");
    }

    public static void wine( ){ ・・・・・・・・・・・・・・・・・メソッド2:wineの定義
     System.out.println("method: wine");
    }

    public static void main(String[ ] args) { ・・・・・・メソッド3:mainの定義
     System.out.println("method: main)";
    }
   }

   実行例

   $ java Beer
   method: main
   $ _

   この実行例を見ると、mainメソッドに書かれた文だけが実行されているのが分かる。
  他のメソッドに書かれた文は、全く実行されていない。mainメソッド以外のメソッドを実行する方法については、次に説明する。

メソッドを置く順序

   1つのクラスの中に複数のメソッドを定義する場合、メソッドを並べる順序は自由である。
  例えば、上記のアプリケーションでは、beer、wine、mainの順で並べたが、main、wine、beerの順に並べる事も出来る。
  メソッドをどのような順序で並べようと、アプリケーションはmainの最初の文から実行される。

   メソッドは、定義しただけでは実行されない。メソッドを実行するには、実行するように指示を与えなければならない。
  定義したメソッドを実行する事を、メソッドを呼び出すとかメソッドを参照するという。
  具体的には、参照するメソッドの名前に( )を付け、最後にセミコロンを付ければよい。

   メソッド名;

   例えばメソッドbeerを実行するなら次のようにする。

   beer( );

   また、メソッドwineを実行するなら次のようにする。

   wine( );

   次に、先程は実行出来なかったメソッドの参照を追加して、beerやwineを実行出来るようにしたものを示す。

   サンプル:Beer_2.java

   //
   //Beer_2.java---定義したメソッドを参照する。
   //
   public class Beer_2 {
    public static void beer( ) {
     System.out.println("method: beer");
    }

    public static void wine( ) {
     System.out.println("method: wine");
    }

    public static void main(String[ ] args) {
     System.out.println("method: main");
     beer( ); ・・・・・メソッドの参照を追加
     wine( );
    }
   }

   次に書き換えたサンプルの実行例を示す。

   $ java Beer_2
   method: main
   method: beer
   method: wine
   $ _

引数

   これまでのメソッドでは、引数を使ってこなかった。これからメソッドの引数について説明する。
  引数を使う事で、メソッドの呼び出し側からメソッドに対してデータを送信する事が出来る。

仮引数の定義

   メソッドを参照する時、メソッドに対して引数を渡す事が出来る。
  その為には、メソッドを定義する時、一緒に仮引数を定義する必要がある。
   仮引数というのは名前の通り、仮の引数である。本当の引数は、そのメソッドを呼び出す時に指定され、
  その本物のの引数の値が仮引数に代入される。メソッドの本体では、仮引数を普通の変数のように使う事が出来る。
   仮引数は、メソッド名の後ろの( )の中で定義する。

   public static void メソッド名(仮引数の定義) 下線部にて設定
   {
    文
    …
   }

   仮引数の定義は、次のように仮引数の型と名前を組にして指定する。

   型 仮引数名

   次に例を示す。この例では、nvalというint型の仮引数を定義している。

   public static void func(int nval)

   複数の仮引数が必要な場合は、仮引数をカンマで区切って並べる。

   型 仮引数名, 型 仮引数名, ……

   例えば次のメソッドfuncは、int型の仮引数 n とfloat型の仮引数valを定義している。

   public static void func(int n,float val)

引数つきメソッドの参照

   引数が定義されているメソッドを呼び出すときは、次のように引数をカンマで区切って並べる。

   メソッド名(引数1, 引数2, ……);

   例えば先のメソッドfuncを呼び出す時は、次のようにする。

   func(10, 2.718282);

   ここで指定した引数10や2.718282を仮引数に対して実引数という。指定された実引数は、メソッドfuncの仮引数に代入される。

   n = 10;
   val = 2.718282;

   つまり、メソッドを呼び出す側の第1引数10がメソッド定義側の第1仮引数nに代入され、
  第2引数の2.718282が定義側の第2仮引数に代入される。

   呼び出し側: func(10,2.718282); ・・・・・・・・・・・・・・・実引数

               ↓代入される

   受け取り側: void func(int n, float val) ・・・・・・・・・・仮引数

   引数つきのメソッドの例として、min〜maxまでの整数の合計を計算して表示するメソッドを作成する。

   public static void min_max(int min, int max) {
    //ここでmin〜maxまで整数の合計を計算して表示する。
   }

   min〜maxまでの合計は、次のようにして計算する事が出来る。

   (max * (max + 1) - min * (min - 1)) / 2

   したがってメソッドmin〜maxは、次のようになる。

   public static void min_max(int min, int max) {
    System.out.println((max * (max + 1) - min * (min - 1)) /2);
   }

   このメソッドmin_maxを利用するには次のようにする。

   min_max(1,10); ・・・・・・・・・・1〜10までの合計を表示する
   min_max(1000,2000); ・・・・・1000〜2000までの合計を表示する

   以上をテストする為のサンプル

   //
   //Min_Max.java---min〜maxまでの合計を表示する
   //
   public class Min_Max {
    public static void min_max(int min, int max) {
     System.out.println((max * (max + 1) - min * (min -1)) / 2);
    }

    public static void main(String[ ] args) {
     System.out.print("1〜10までの合計=");
     min_max(1,10);

     System.out.print("1000〜2000までの合計=");
     min_max(1000,2000);
    }
   }

   この中では、printという新しい使い方が出てきている。printはprintlnとほとんど同じである。ただし、最後に改行を出力しない。

   println ・・・・・文字列を出力した後、改行する。
   print ・・・・・・文字列を出力した後、改行しない。

   実行例

   $ java Min_Max
   1〜10までの合計= 55
   1000〜2000までの合計= 1501500
   $ _

メソッドの値

   これまでメソッドの定義を次のようにしてきた。

   public static void メソッド名(引数) {
    文1
    文2
    …
   }

   このうちメソッド名の前につけるpublicとかstaticとかvoidについては、意図的に説明を避けてきた。
  今回は、これらのうちvoidの部分について説明する。

メソッドを途中で抜ける

   いまdouble型の引数を2つ取るdivideというメソッドがあるとする。

   public static void divide(double n1, double n2) {
     …
   }

   このメソッドは、与えられた引数の除算を行い、その結果を表示する。

   n1 ÷ n2 ・・・・・この結果を表示する

   ところで除算を行う時は、0で割る事はできない。したがって、もしn2の値が0ならば、
  エラーメッセージを出力して除算をキャンセルするようにしたい。
  そこで、このメソッドの先頭部分に次のようなif文を入れる。

   if (n2 == 0) {
     System.out.println("0で割る事はできません");
     //ここでこのメソッドを抜ける
   }

   まとめると、メソッドdivideは次のようになる。

   public static void divide(double n1, double n2) {
    if (n2 == 0) {
      System.out.println("0で割る事はできません");
      ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・(1)
    }
    System.out.println(n1 + "÷" + n2 "=" + n1 / n2);
   }

   問題は、この(1)の部分である。n2が0の場合は、ここでメソッドdivideの処理を中止し、途中でメソッドを抜け出したい。
  しかし、通常はメソッドの最後まで処理を実行してしまう。
   もちろんelse節を作れば、このことは可能である。
  しかし、この例にかかわらず「メソッドを途中で抜け出したい」事はある。そのような時は、次に説明するreturn文を使う。

return文

   return文を使うと、メソッドの途中からただちに抜ける事が出来る。
  例えば次のようなメソッドがあった場合、文1〜文3を実行したところでメソッドを抜け出してしまう。この場合、文4〜文5は実行されない。

   public static void divide(double n1, double n2) {
    文1;
    文2;
    文3;
    return; ・・・・・ここでメソッドを抜ける
    文4;
    文5;
   }

   return文は、mainメソッドには使えない。mainメソッドを抜けるとアプリケーションが終了するという特殊性があるからで、
  mainメソッドを抜けるには、既に説明したexit文を使用する。
   次にreturn文を使ったサンプルアプリケーションを示す。この中に出てくるメソッドdivideは、先程と同様の除算を行うものである。

   サンプル:Divide.java

   //
   //Divide.java---return文の使い方
   //
   public class Divide {
    public static void divide(double n1, double n29 {
     if (n2 == 0) {
       System.out.println("0で割る事はできません");
       return;
     }
    System.out.println(n1 + "÷" + n2 + "=" + n1/n2);
    }

    public static void main(String[ ] args) {
     if (args.length < 2) {
       System.out.println("使い方:コマンド名数字数字");
       System.exit(1);
     }
    divide(Double.perseDouble(args[0], Double.perseDouble(args[1]));
    }
   }

   実行例

   $ java Divide ・・・・・・・・・・・・・引数を与えない場合
   使い方:コマンド名数字数字
   $ java Divide 4380.23 0 ・・・・除数に0を指定した場合
   0で割る事はできません
   $ java Divide 4380.23 52.09
   4380.23÷51.09=85.73556468976315
   $ _

メソッドの値

   引数を使うと、メソッドの呼び出し用側からメソッドにデータを送信する事が出来る。
  逆にメソッドからメソッドの呼び出し用側のデータを送信する事も出来る。このデータをメソッドの値、あるいはメソッドが返す値という。

   メソッドには、値を返すものと返さないものがある。
  メソッドがその呼び出し側に値を返す時、その値を前項で取り上げたreturn文で指定する。
  すなわち、return文の後ろに値を指定すると、その値が「メソッドの値」になる。

   return 値; ←この値がメソッドの呼び出し側に返される

   例えば、fooという名前の値を返すメソッドがあったとする。そのfooの中で次のようにしてreturn文を使ったとする。

   return 12345;

   すると、ここで指定した12345が呼び出し側に返される。例えば、次のようにしてfooを呼び出すと、変数xに12345が代入される。

   x = foo(・・・・); メソッドfooの呼び出し

   return文で指定出来る値は1つだけである。引数のように複数の値を指定する事はできない。

   return 値, 値, …; ・・・・・これはダメ

   したがって、メソッドからメソッドの呼び出し用側に返せる値は1つだけである。

メソッドの型

   javaで使用されるデータにはcharとかintといったような型がある。
  当然メソッドの値にも型がある。その型を指定するのが、メソッドの定義におけるvoidの部分である。

   public static void メソッド名(引数) { ・・・下線部でメソッドの値の型を指定する

   例えば、int型の値を返すメソッドならば、次のようにvoidの代わりにintを指定する。

   public static int メソッド名(引数) {

   また、double型の値を返すメソッドならば、次のようにdoubleを指定する。

   public static double メソッド名(引数) {

void

   では、これまで型名の代わりに使用してきたvoidは何かと言うと、そのメソッドが値を持たない(値を返さない)事を示す。
  まとめると、メソッドの定義はそのメソッドが値を返すか返さないかにより、次の2通りの書き方がある。

  値を返さないメソッドの定義
   public static メソッド名(引数) { ・・・下線部にvoidを指定する
    文1
    文2
    …
    return; ・・・return文を使う場合は値を指定しない
   }

  値を返すメソッドの定義
   public static (引数) { ・・・下線部にintなどの型名を指定する
    文1
    文2
    …
    return 値; ・・・必ずreturn文を使って返す値を指定する
   }

大きいほうの値を返す

   値を持つメソッドの例として、引数で指定された2数のうち大きいほうの値を返すメソッドbiggerを作成する。

   public static int bigger(int n1, int n2) {
    return「n1, n2のうち大きいほうの値」;
   }

   もしn1とn2が等しい場合は、その値を返す。そのようなメソッドbiggerの作成例とテストできるサンプルを示す。

   サンプル:Bigger.java

   //
   //Bigger.java---値を返すメソッド
   //
   public class Bigger
    //大きい方の値を返す
    //等しい場合は、その値を返す
    public static int bigger(int n1, int n2) {
     if (n1>= n2)
      return n1;
     else
      return n2;
    }

    public static void main(String[ ] args) {
     if (args.length <2) {
      System.out.println("使い方:コマンド名数字数字");
      System.exit81);
    }

    int n1 = Integer.parseInt(args[0]);
    int n2 = Integer.parseInt(args[1]);

    System.out.println(n1 + "と" +n2 + "では" + bigger(n1,n2) + ”の方が大きいです");
    }
   }

   実行例

   $ java Bigger 1 7 ・・・・・・・・・右の値のほうが大きい場合
   1と7では7の方が大きいです
   $ java Bigger 28 9 ・・・・・・・・左の値のほうが大きい場合
   28と9では28の方が大きいです
   $ java Bigger 100 100 ・・・・・同じ値の場合
   100と100では100の方が大きいです
   $ _

次へ