こんにちは。ECF Techブログ
担当 Michiharu.Tです。
Javaプログラミング入門記事の第6章をお送りいたします。
第6章のテーマは「メソッド」です。
第6章は2回のパートに分けて掲載します。今回はPart1です。
本連載の初回および章立ての一覧については下記のリンクから確認できます。
解説動画
2024/01/05 解説動画を掲載しました。
6-1 メソッドとは
メソッドは、複数の指示をまとめて1つの名前で扱えるようにしたものです。これまではpublic static void main
の始まりで記述していたmainメソッドと呼ばれるメソッド1つでしたが、本章からは下図のように、複数のメソッドを使ったプログラム構成となります。(※クラスブロック内には複数のメソッドを記述できます。)
複数のメソッドが動作する様子を、母親が子供におつかいを依頼する例と合わせて説明します。
図の上部は、母親が子供に「おつかい」を依頼するイメージです。おつかいの流れを一般化すると
- 母親は子供に、買うものメモとお金を渡します。
- 子供はスーパーなどに行ってメモに書かれた品物を買ってきます。
- 子供は買ってきた品物を母親に渡します。
という流れになるでしょう。
ポイントは下の3つです。
- 子供が行うべき複数の動作をまとめて「おつかい」と呼んでいる。
- 母親は「おつかい」の前に必要なものを渡す。
- 子供は「おつかい」の後に結果を渡す。
一方、複数のメソッドが動作する様子もこれに似ています。下図で説明します。
依頼されるメソッドは「三角形の面積を求める」という仕事を依頼されるものとします。この2つのメソッドが動作する様子を示すと
- 依頼するメソッドは依頼されるメソッドに対し、底辺と高さの情報を渡します。
- 依頼されるメソッドは渡された情報を基に、三角形の面積を計算します。
- 依頼されるメソッドは計算結果を依頼するメソッドに返します。
という流れになります。下のように比較すると、おつかいと似たようなことが行われていることがわかります。
おつかい | メソッドの動作 |
---|---|
母親 | 依頼するメソッド |
子供 | 依頼されるメソッド |
買うものメモとお金 | 底辺と高さの情報 |
買ってきた品物 | 計算結果 |
メソッドの動作イメージについては以上です。
6-1-1 メソッドの基本
ではここから、6-1で説明した複数のメソッドが動作する様子をプログラミング用語に置き換えていきましょう。下図で説明します。
- メソッドに処理を依頼することを「メソッドを呼び出す」と言います。
- メソッドを呼び出す際は、メソッドにつけられた名前(メソッド名) を使用します。
- メソッドを呼び出す際に渡す値を引数と言います。
- 呼び出したメソッドから返ってくる値を戻り値と言います。
以上が基本的な概念と用語になります。実際の動作の様子は動かしながら学んだ方がイメージしやすいですので、次節から早速プログラミング例を紹介します。
6-2 メソッドの定義と呼び出し
メソッドを呼び出すためには、まずメソッドを作成する必要があります。これをメソッドの定義と言います。メソッド定義の文法を示します。
public static 戻り値型 メソッド名(引数...){ //何らかの処理 }
次にメソッド呼び出しの文法です。
メソッド名(引数...)
上記2つの文法を使ったプログラム例を示します。
プログラム例
public class Main { public static void main(String[] args) { greeting(); } //あいさつ文を表示するメソッド。 public static void greeting() { System.out.println("こんにちは"); System.out.println("今日はいい天気ですね。"); } }
実行結果
こんにちは 今日はいい天気ですね。
解説
- このプログラムには2つのメソッドがあります。1つはこれまで作成してきたmainメソッド(2~4行目)、もう1つが6~9行目のメソッドです。
greeting
がメソッド名です。 - メソッドが複数定義された場合も、mainメソッドからプログラムがするという原則は変わりません。
- 3行目の
greeting();
がメソッドの呼び出し部分です。これによりgreetingメソッドブロック内の処理が実行され、画面にあいさつ文が表示されます(下図)。
引数や戻り値などについては、6-3で順に説明を致します。現時点ではメソッドを呼び出すことによって、定義されたメソッドのブロック内が動作する。 という点を理解できていればOKです。
作成したメソッドは何度でも呼び出すことができます。上記プログラムに処理を追加した例を示します。
プログラム例
public class Main { public static void main(String[] args) { greeting(); greeting(); greeting(); } //あいさつ文を表示するメソッド。 public static void greeting() { System.out.println("こんにちは"); System.out.println("今日はいい天気ですね。"); } }
実行結果
こんにちは 今日はいい天気ですね。 こんにちは 今日はいい天気ですね。 こんにちは 今日はいい天気ですね。
解説
mainメソッドにおいて、greetingメソッドの呼び出しが3回行われています。よって、あいさつ文が3回表示されています。
6-3 引数と戻り値
6-3-1 引数のないメソッド
ここでは三角形の面積を求めるメソッドを題材に、引数と戻り値の役割について説明します。
始めにプログラムを示します。
プログラム例
public class Main { public static void main(String[] args) { getMenseki(); } //三角形の面積を求めるメソッド。 public static void getMenseki() { //底辺8、高さ4とする int ans = 8 * 4 / 2; System.out.println(ans); } }
実行結果
16
解説
三角形の面積を求めるメソッドとして、getMensekiメソッドを作成しました。3行目ではgetMenseki();
の記述でgetMensekiメソッドを呼び出すことで、三角形の面積を表示しています。
ただし、引数と戻り値はありません。この場合のメソッド定義の文法は次のようになります。
public static void メソッド名(){ //何らかの処理 }
- 引数がない場合、メソッド定義の
()
内には何も書きません。 - 戻り値が無い場合、メソッド定義の戻り値型の部分は
void
と記述します。
メソッドを呼び出す側(3行目)も引数がないので、getMenseki();
のように、()
内に何も記述していません。
このgetMensekiメソッドは、底辺と高さの値がそれぞれ直接記述されており、底辺が8で高さが4の三角形の面積以外は求めることができません。
これではあまり使い道がないので、引数を使って様々な大きさの三角形の面積を求められるように改良したいと思います。
6-3-2 引数を使ったメソッド
プログラム例を示します。
プログラム例
public class Main { public static void main(String[] args) { getMenseki(8, 4); //底辺が8、高さが4 getMenseki(9, 12); //底辺が9、高さが12 } //三角形の面積を求めるメソッド。 public static void getMenseki(int teihen, int takasa) { int ans = teihen * takasa / 2; System.out.println(ans); } }
実行結果
16 54
解説
引数を使う場合、定義部分の書き方は次のようになります。
public static 戻り値型 メソッド名(型名 引数名1, 型名 引数名2, ...){
()
内が引数を指定する部分です。メソッド呼び出し時に、呼び出し側のメソッドから受け取りたい値の数だけ変数宣言が並ぶようなイメージです。プログラム中(7行目)ではint teihen, int takasa
となっていますので、引数として2つ定義したことになります。
一方、引数を持つメソッドを呼び出す際の書き方は次のようになります。
メソッド名(値,値,...)
3行目のgetMensekiメソッドを呼び出す処理では、定義部分の引数の数に合わせ、2つの値を,
で区切って指定しています。この場合、下図のようにgetMensekiメソッドの引数に8
と4
が代入された状態で、動作します。
teihen
が8
、takasa
が4
の状態でgetMensekiメソッドが動作するので、底辺が8、高さが4の三角形の面積を求め、結果の16
が画面に表示されます。
次の4行目では引数部分を(9,12)
としてgetMensekiメソッドを呼び出しています。teihen
が9
、takasa
が12
の状態でgetMensekiメソッドが動作し、結果の54
を表示しています。
様々な大きさの三角形の面積を求めるgetMensekiメソッドが完成しました。
6-3-3 戻り値の利用
引数を使って改良したgetMensekiメソッドが、現状できることは三角形の面積を表示することだけです。
ですが実際には、呼び出す側のメソッドのニーズはもっと多様です。三角形の面積を表示したいだけの時もあれば、三角形の面積を別の計算に利用したい。というケースもあるでしょう。
このようなニーズに対応できるようにするため、次は戻り値を使ってgetMensekiメソッドを改良します。
先にプログラムを示します。
プログラム例
public class Main { public static void main(String[] args) { int menseki1 = getMenseki(3,6); //三角形の面積を表示 System.out.println("三角形の面積は" + menseki1 + "です。"); int menseki2 = getMenseki(4,4); int goukei = menseki1 + menseki2; System.out.println("三角形の面積の合計は" + goukei + "です。"); } //三角形の面積を求めるメソッド。 public static int getMenseki(int teihen, int takasa) { int ans = teihen * takasa / 2; return ans; } }
実行結果
三角形の面積は9です。 三角形の面積の合計は17です。
解説
getMensekiメソッドの定義部分(12行目)では、戻り値型の部分がint
になっています。戻り値型の記述場所を確認するため、メソッド定義の文法を再掲します。
メソッド定義の文法
public static 戻り値型 メソッド名(引数...){
getMensekiメソッドの定義
public static int getMenseki(int teihen, int takasa) {
したがって、getMensekiメソッドは何らかのint型の値を返さなければいけません。値を返す処理はreturn文を使って記述します。return文の文法は次のようになります。
return 値;
14行目が値を返している処理です。例では三角形の面積を求めた結果が代入された変数ans
を戻り値として返しています。
一方、呼び出し側のメソッドでは、その戻り値を受け取ることができます。戻り値を受け取る場合の文例は次のようになります。
型 変数名 = メソッド呼び出し;
下図は3行目が実行された際、戻り値を受け取るイメージです。見やすさのため3行目とgetMensekiメソッド部分のみを表示しています。
図のとおり、3行目のプログラムが代入されると変数menseki1
には9が代入されます。
次に7~9行目について説明します。
- 7行目では再度getMensekiメソッドを呼び出し、戻り値を変数
menseki2
で受け取っています。 - 次の8行目ではその変数
menseki2
とmenseki1
の合計を求めています。
ここでお伝えしたいポイントは、
3行目のgetMensekiメソッドの結果は「表示」に用いているのに対し、
7行目のgetMensekiメソッドの結果は「計算」に用いているという点です。
このように、あるメソッドが求めた結果を呼び出し側のメソッドが自由に利用できることが、戻り値を活用するひとつのメリットです。
説明が長くなりましたので、本プログラムの処理の流れをまとめます。
- 底辺3、長さ6の三角形の面積を変数
menseki1
に代入。 - 変数
menseki1
の値を表示。 - 底辺4、長さ4の三角形の面積を変数
menseki2
に代入。 - 変数
menseki1
と変数menseki2
の合計を変数goukei
に代入 - 変数
goukei
の値を表示。
Part2につづく