Java講座: メソッド
メソッドを簡単に言うと「処理をまとめたもの」です。
プログラミングをしていると、「この処理、同じようなやつさっきやったばっかだな」とか、「この処理、この後も何回か使いそうだな」と思うことが結構あります。そういった処理をメソッドにしておくことで、どこかで同じ処理をしたいときにメソッドを呼び出すだけでできるようになります。具体例を使って解説します。
たとえば、「3つの配列(A,B,C)の、それぞれの平均値を求める」というプログラムをこのように書いたらどう思うでしょうか?
public class Main {
public static void main(String[] args) {
int[] A = {1, 2, 3, 4, 5};
int[] B = {2, 34, 9, 102, 3, 77, 81, 4};
int[] C = {145, 837, 9179, 333};
int sum = 0;
// Aの平均値を求める
for (int i = 0; i < A.length; i++) {
sum += A[i];
if (i == A.length - 1) {
int ave = sum / A.length;
System.out.println(ave);
}
}
sum = 0;
// Bの平均値
for (int i = 0; i < B.length; i++) {
sum += B[i];
if (i == B.length - 1) {
int ave = sum / B.length;
System.out.println(ave);
}
}
sum = 0;
// Cの平均値
for (int i = 0; i < C.length; i++) {
sum += C[i];
if (i == C.length - 1) {
int ave = sum / C.length;
System.out.println(ave);
}
}
}
}A,B,Cに対して同じ処理を何度も行っていることに気づいたでしょうか?このように書くことはコードが冗長になって不便ですし、書き間違いの可能性も上がって良いことがありません。
そんなときに使えるのがメソッドです。さっきのプログラムをメソッドを使って書くとこのようになります。実際に実行してみましょう。
public class Main{
public static void main(String[] args) {
int[] A = {1, 2, 3, 4, 5};
int[] B = {2, 34, 9, 102, 3, 77, 81, 4};
int[] C = {145, 837, 9179, 333};
int aveA = ave(A);
int aveB = ave(B);
int aveC = ave(C);
System.out.println(aveA);
System.out.println(aveB);
System.out.println(aveC);
}
public static int ave(int[] a) {
int sum = 0;
for (int i = 0; i < a.length; i++) {
sum += a[i];
}
int ave = sum / a.length;
return ave;
}
}メソッドの特徴は、引数と 返り値(戻り値) が必要であるということです。
public staticpublicがprivateになったり、staticを書かない場合があったりなどがありますが、今のところは「おまじない」です。int: 戻り値の型 メソッドが最終的に返す値がどんな型を表します。今回のメソッドでは平均値(整数)を返したいためintを指定しています。ave: メソッド名 メソッドの名前です。変数名同様好きな名前をつけてよいですが、ひと目でどんな処理をしているのか分かるような命名をしましょう。(int[] a): 引数 メソッドの呼び出し元から渡す変数のことです。aveメソッドがmainメソッドの外に書かれていることに気づいたでしょうか?実はaveメソッドから直接mainメソッド内の変数にアクセスすることはできません。そのため、「mainメソッドにあるこの変数の値はどうしても使いたい!」というときには、引数として明示的に渡してあげる必要があります。
型さえあっていれば、引数の名前はメソッド内で自由に決めることができます。 今回の引数の書き方は「整数型の配列を1つ受け取って、このメソッド内ではaという名前で扱う」という意味になります。return ave: 返り値 メソッドが返す値です。このメソッドでは平均値の計算結果であるaveを返しています。戻り値を返す際には必ずreturnのあとに書いてください。int aveA = ave(A);: メソッド呼び出し メソッドを呼び出すにはこのように書きます。呼び出したいメソッド(引数として渡す変数)の形式で書きます。今回のaveメソッドは渡された配列の平均値をint型で返すため、その結果をaveAという変数に代入しています。
メソッドの構文
これらの内容をまとめると、メソッドを書くときの構文は以下のようになります。
public static [返り値の型] [メソッド名]([引数の型] [引数の変数名]) {
メソッド内での処理
return [返り値];
}また、メソッドはクラスの中かつ mainメソッドの外に書くようにしてください。
public class Main {
public static void main(String[] args) {
// ...
}
public static int method() {
// ...
}
}返すものがない場合は?
メソッドは返り値を指定する必要がありますが、返り値がない処理(画面に文字を表示するだけなど)もメソッドにすることができます。その場合は戻り値の型にvoidを指定してください。
public class Main {
public static void main(String[] args) {
sayHello("田中");
}
public static void sayHello(String name) {
System.out.println("Hello, " + name);
}
}また、void型のメソッドの場合、呼び出し元では結果を入れておく変数は必要ありません。そもそも返り値が存在しませんからね。
引数がいらない場合は?
引数がいらないメソッドも存在します。その場合には()の中に何も書かなければOKです。
public static void greeting() {
System.out.println("おはよう!");
}練習問題
後半に行くにつれてだんだん難しくなっていきます。入力は標準入力で受け取ってもいいですし、プログラム内にベタ書きしてもOKです。 今日中に全部解けなくても大丈夫です。がんば!
問題1
2つの整数を受け取り、足した結果を返すメソッドを作成してください。
条件
- メソッド名は
add - 引数は2つで、どちらも
int型 (add(int a, int b)みたいに書くと引数を複数個指定できます) - 返り値は
int型
問題2
2つの整数を受け取り、大きい方を返すメソッドを作成してください。
条件
- メソッド名は
max - 引数は2つで、どちらも
int型 - 返り値は
int型
問題3
整数を受け取り、それが偶数かどうかを判定するメソッドを作成してください。
条件
- メソッド名は
isEven - 引数は1つで、
int型 - 返り値は
boolean型
イメージ
isEven(4)はtrue, isEven(3)はfalseを返すようなプログラムを作れればいいですね
問題4
String型の配列を受け取り、配列内で最も長い文字列を返すメソッドを作成してください。
条件
- メソッド名は
getLongestString - 引数は
String[]型 - 返り値は
String型
ヒント
文字列の長さはlength()メソッドで取得できます。 例えばstrという名前の文字列の長さを取得したいときにはstr.length()と書きます。
問題5
1つの整数を受け取り、(受け取った整数)段の三角形を出力するメソッドを作成してください。
条件
- メソッド名は
printTriAngle - 引数は
int型 - 返り値はなし(
void型)
実行例
引数が3のとき
*
**
***引数が5のとき
*
**
***
****
*****引数が8のとき
*
**
***
****
*****
******
*******
********問題6
問題5の三角形を左右反転させたものを出力するメソッドを作成してください。
条件
問題5と同じです。
実行例
引数が5のとき
*
**
***
****
*****余談
関数とメソッドの違い
JavaScriptなどの言語では、今回紹介したメソッドのことを「関数」と呼びます。では、関数とメソッドの違いとは?
筆者の解釈が強めに出ているので完全に正しい説明とは言えませんが、関数とメソッドの最大の違いは「オブジェクトに属しているか」という点でしょう。
オブジェクトはJavaではクラスで管理されます。つまり、「クラスに属しており、特定のデータ型に紐づいていること」がメソッドがもつ特徴と言えるでしょう。
Javaはすべてのデータをクラスで管理するという特徴をもった言語です。したがって、Javaにおける関数は厳密にはすべてメソッドです。クラスから独立した関数が存在しませんからね。