今、次のようなプログラムを考えます。
class NameTag1 { // 名札1 public static void main (String[] args) { System.out.println("-------------------------"); System.out.println("-------------------------"); System.out.println("No."); System.out.println("-------------------------"); System.out.println("Name"); System.out.println(); System.out.println("-------------------------"); System.out.println("-------------------------"); } }
PS ...\Desktop\java1> & ... 'NameTag1' ------------------------- ------------------------- No. ------------------------- Name ------------------------- ------------------------- PS ...\Desktop\java1>
3行目、4行目、6行目などに、罫線を出力するという、まったく同じ処理が繰り返されています。 これらの処理に名前をつけ、その名前で処理が表せると、プログラムが読みやすく、かつ書きやすくなります。 メソッドというものを用いると、そのようなことができます。 なお、メソッドには「インスタンス・メソッド」というものと「クラス・メソッド」というものがあります。 今日はクラス・メソッドのみ扱います。
メソッド ( method )とは、処理のまとまりに名前をつけたプログラム単位です。 メソッドを使うためには、プログラムの中でメソッドを定義しなくてはいけません。 メソッドの定義は次のような形をとります。
static void メソッド名 () { 文; ... }
これによって、処理のまとまり「 文 」、...に「 メソッド名 」という名前がつきます。
定義したメソッドを使うには、プログラムに次のような文を書きます。 これを メソッド呼出し ( method call )とよびます。
メソッド名();
プログラムの中にメソッド呼出しがあると、実行の流れは次の図のようになります。 メソッド呼出し method ()を実行するとき、メソッド method の定義の内容を実行し、それが終わったら、メソッド呼出しの次から実行します。
上記のプログラムの場合、次のようになります。 罫線を出力するという処理に、 rule という名前をつけています。 メソッド呼出し rule ()を実行すると、罫線が出力されます。
class NameTag2 { // 名札2 static void rule () { // メソッド定義 System.out.println("-------------------------"); } public static void main (String[] args) { rule(); // メソッド呼出し rule(); // メソッド呼出し System.out.println("No."); rule(); // メソッド呼出し System.out.println("Name"); System.out.println(); rule(); // メソッド呼出し rule(); // メソッド呼出し } }
メソッドは、いくつも定義することができます。 次の例では、罫線を出力するメソッド rule と、二重の罫線を出力するメソッド doubleRule を定義しています。
class NameTag3 { // 名札3 static void rule () { // 罫線 System.out.println("-------------------------"); } static void doubleRule () { // 二重の罫線 System.out.println("-------------------------"); System.out.println("-------------------------"); } public static void main (String[] args) { doubleRule(); System.out.println("No."); rule(); System.out.println("Name"); System.out.println(); doubleRule(); } }
上記の例では、罫線を出力するメソッド rule と、二重の罫線を出力するメソッド doubleRule を定義しました。 このまま、三重の罫線、四重の罫線、…と定義するのは面倒です。 できれば、メソッドに変数 n を入力して、 n 重の罫線を出力するメソッドにしたいものです。
メソッドには引数を与えることができます。 引数 (ひきすう)( argument )とは、メソッドに対する入力データだと思ってください。
整数(int型)の引数を持つメソッドは次のように定義されます。 「 引数 」の部分に、引数を表す変数を書きます。
static void メソッド名 (int 引数, ...) { 文; ... }
引数が実数(double型)ならば、
int
の代わりに
double
と書きます。
このようなメソッドを呼び出すには、次のように書きます。 「 引数 」の部分に、引数となる式を書きます。
メソッド名(引数, ...);
メソッド定義の引数を 仮引数 ( formal argument )とよび、メソッド呼出しの引数を 実引数 ( actual argument )とよびます。 メソッドは呼び出されると、仮引数(変数)に実引数(式)の値が代入され、メソッド定義の内容が実行されます。
次の例では、 n 重の罫線を出力するメソッド multiRule を定義しています。 メソッド呼出し multiRule (2)が実行されると、メソッド定義の仮引数 n に実引数の値2が代入され、罫線の出力を2回繰り返すようにメソッドが実行されます。
class NameTag4 { // 名札4 static void multiRule (int n) { // n重の罫線 for (int i = 0; i < n; i++) { System.out.println("-------------------------"); } } public static void main (String[] args) { multiRule(2); // n = 2 System.out.println("No."); multiRule(1); // n = 1 System.out.println("Name"); System.out.println(); multiRule(2); // n = 2 } }
メソッドは、まとまった処理をするだけでなく、何らかの計算をして、その結果を呼び出し側に返すこともできます。 そのような値(計算結果)を、メソッドの 返り値 ( return value )または 戻り値 とよびます。 返り値は、メソッドの出力データと考えてください。
一般的なプログラミングの用語では、値を返さないプログラム単位を 手続き ( procedure )と呼び、値を返すプログラム単位を 関数 ( function )と呼びます。 Javaでは、手続きも関数もメソッドで実現します。
整数(int型)の返り値を持つメソッドは、次のように定義されます。
static int メソッド名 (int 引数, ...) { 文; ... }
これまでの、返り値を持たないメソッド定義での
void
の代わりに、
int
と書きます。
返り値が実数(double型)ならば、
void
の代わりに
double
です。
この定義の中に、少なくとも一つreturn文を書きます。 return文 は次のような形をとり、「 式 」の値がこのメソッドの返り値になります。
return 式;
返り値を持つメソッドは、次のような式で呼び出します。
メソッド名(引数, ...)
式の中にメソッド呼出しがあると、メソッド定義の内容が実行されます。 そして、その中のreturn文が実行されるとメソッドは終了し、return文の式の値が呼び出し側に返されます。
次の例では、引数の2乗を返すメソッド square と、引数の3乗を返すメソッド cube を定義しています。
class SquareCubeTest { // 2乗と3乗のテスト static int square (int x) { // メソッド定義 return x * x; // 値を返す } static int cube (int x) { // メソッド定義 return x * x * x; // 値を返す } public static void main (String[] args) { System.out.println("square(100) = " + square(100)); // メソッド呼出し System.out.println("cube(100) = " + cube(100)); // メソッド呼出し } }
PS ...\Desktop\java1> & ... 'SquareCubeTest' square(100) = 10000 cube(100) = 1000000 PS ...\Desktop\java1>
次の例では、2つの引数のうち、大きい方を返すメソッド
max
と、小さい方を返すメソッド
min
を定義しています。
引数が複数あるときは、コンマで区切ります。
仮引数の
int
を一つにまとめることはできません。
class MaxMinTest { // 最大値と最小値のテスト static int max (int m, int n) { // int m, n はエラー if (m > n) { return m; } else { return n; } } static int min (int m, int n) { // int m, n はエラー if (m < n) { return m; } else { return n; } } public static void main (String[] args) { System.out.println("max(100, 200) = " + max(100, 200)); // m = 100, n = 200 System.out.println("min(100, 200) = " + min(100, 200)); // m = 100, n = 200 } }
PS ...\Desktop\java1> & ... 'MaxMinTest' max(100, 200) = 200 min(100, 200) = 100 PS ...\Desktop\java1>
注意:
返り値を持たないメソッドでもreturn文が使えます。
この場合、式を抜いた
return;
という形になります。
メソッドの実行中にreturn文を実行すると、そこでメソッドは終了します。
メソッドの例として、はじめに m の n 乗を計算するメソッド power を定義します。 ここで、 n ≧0 と仮定します。
メソッド
power
の引数は、整数
m
と
n
です。
このメソッドは整数を返すので、
static int
と指定します。
メソッド定義では、まず、変数 result を宣言し、1で初期化します。 そして、for文の中で result の値を n 回 m 倍します。 最後に、 result の値をreturn文で返します。
メソッド呼出しでは、例として、 power (2, 5), power (5, 2), power (3, 3)の3つの式を計算します。
プログラムは次の通りです。
class PowerTest { // べき乗のテスト static int power (int m, int n) { // mのn乗 int result = 1; for (int i = 0; i < n; i++) { // n回m倍する result *= m; } return result; } public static void main (String[] args) { System.out.println("power(2, 5) = " + power(2, 5)); System.out.println("power(5, 2) = " + power(5, 2)); System.out.println("power(3, 3) = " + power(3, 3)); } }
PS ...\Desktop\java1> & ... 'PowerTest' power(2, 5) = 32 power(5, 2) = 25 power(3, 3) = 27 PS ...\Desktop\java1>
次の例は、階乗を計算するメソッド fact です。 ここで n の階乗とは、 n !と表され、
と定義されるものです。 ( n ≧0 と仮定します。)
メソッド
fact
の引数は、整数
n
です。
このメソッドは整数を返すので、
static int
と指定します。
メソッド定義では、まず、変数 result を宣言し、1で初期化します。 そして、for文の中で result の値を1倍し、2倍し、…、 n 倍します。 最後に、 result の値をreturn文で返します。
メソッド呼出しでは、例として、 fact (4), fact (5), fact (6) の3つの式を計算します。
プログラムは次の通りです。
class FactTest { // 階乗のテスト static int fact (int n) { // nの階乗 int result = 1; for (int i = 1; i <= n; i++) { // 1倍2倍...n倍する result *= i; } return result; } public static void main (String[] args) { System.out.println("fact(4) = " + fact(4)); System.out.println("fact(5) = " + fact(5)); System.out.println("fact(6) = " + fact(6)); } }
PS ...\Desktop\java1> & ... 'FactTest' fact(4) = 24 fact(5) = 120 fact(6) = 720 PS ...\Desktop\java1>
上記のメソッド square や cube を参考にして、円、ドル、ユーロの間で両替をするメソッドを定義して、それらを呼び出すプログラムを作成してください。 1ドルは140.0円、1ユーロは160.0円とします。
円をドルに両替する場合は、メソッドの名前を
yenToDollar
とします。
このメソッドの引数は、実数
yen
です。
このメソッドは実数を返すので、
static double
と指定します。
メソッド定義では、式
yen
/140.0の値をreturn文で返します。
ドルを円に両替するメソッド dollarToYen , 円をユーロに両替するメソッド yenToEuro , ユーロを円に両替するメソッド euroToYen も同様に定義します。
メソッド呼出しでは、例として、 yenToDollar (2240.0), dollarToYen (16.0), yenToEuro (2240.0), euroToYen (14.0) の4つの式について、式自身とその値を出力します。
class YenDollarEuro { public static void main (String[] args) { } }
PS ...\Desktop\java1> & ... 'YenDollarEuro' yenToDollar(2240.0) = 16.0 dollarToYen(16.0) = 2240.0 yenToEuro(2240.0) = 14.0 euroToYen(14.0) = 2240.0 PS ...\Desktop\java1>
余力のある人は、ドルをユーロに両替するメソッドと、ユーロをドルに両替するメソッドも定義してください。
PS ...\Desktop\java1> & ... 'YenDollarEuro2' yenToDollar(2240.0) = 16.0 dollarToYen(16.0) = 2240.0 yenToEuro(2240.0) = 14.0 euroToYen(14.0) = 2240.0 dollarToEuro(16.0) = 14.0 euroToDollar(14.0) = 16.0 PS ...\Desktop\java1>
今日の演習10の答案(Javaプログラム)をメールで提出してください。 差出人は大学発行のメール・アドレス(学生番号@cis.twcu.ac.jp)とし、宛先はkonishi@cis.twcu.ac.jpとします。 メールの本文には、学生番号、氏名、科目名、授業日(6月13日)を明記してください。