【初心者の悩み解決!!】Java言語でのメソッドの書き方

Java

【初心者の悩み解決!!】Java言語でのメソッドの書き方

 

Javaでプログラムを作成する場合、多くの書籍ではmain()の中に全てのコードを記述していますが、実際には複数のメソッドに分けて記述します。しかし、初心者はメソッドに分けて記述しようとすると、どう記述すれば良いのか分からず、いきなりプログラムが書けなくなります。今回は、メソッドの書き方を詳しく説明します。

 

まず、この記事は以下のような人を対象としています。

対象者・メソッドを利用する利点を知りたい人

・メソッドの書き方を知りたい人

・引数や戻り値について知りたい人

 

この記事を読むと、次のようなことが理解できるようになります。

この記事を読むとできること・メソッドを利用したプログラムを作成することができる

・4種類のメソッドの書き方を知ることができる

・引数や戻り値について理解することできる

 

太郎さん
太郎さん

Javaでプログラムを記述する時に、メソッドを使おうとしているのですが、うまく書けません。

続石講師
続石講師

以前、おみくじプログラムの作り方でメソッドの使い方を簡単に説明しましたが、今回はより詳しい書き方を説明します。

太郎さん
太郎さん

何度も記事を読んで確認しているのですが、なかなかコツがつかめません。

続石講師
続石講師

メソッドの書き方は4種類あります。それぞれの書き方をじっくり説明していきましょう!!

 

なお、メソッドを利用したおみくじの作り方を以下の記事で解説しています。

【Javaプログラミング】おみくじを作ろう!! メソッド編
Javaのプログラムを作成する時に、みなさんはmain()メソッド内に全部記述していませんか? プログラムはメソッドに分けて記述するのが一般的です。しかし、初学者の人はなかなかメソッドに分けることができないようです。今回は、プログラムをメソッドに分ける考え方を解説します。

 

static修飾子について、以下の記事で説明してます。あわせて参照してみて下さい

【初心者用】Javaのメソッドに付ける『static』って何?!
Javaでプログラムを記述する時、メソッドには必ず「static」を書くと思ってませんか?おまじないのようなものと思って深く考えずに書いてませんか?「static」は重要なキーワードです。今回は「static」について詳しく説明します

 

メソッドとは

メソッドは、「複数の関連する処理をまとめて名前を付けたもの」です。簡単に言うと、何らかの機能です。例えば、電子レンジで食品を温める場合、電子レンジの内部でどのようなことがどのような順番でおこなわれるのか、私たちは全く知りませんし、理解する必要がありません。ただ「温めるボタン」を押すだけです。テレビの電源をつける場合も、内部の仕組みは知りませんが、「電源ボタン」を押すだけです。

「温めるボタン」が押された時に行われる内部での処理は、温める作業に関連のあるものしかありません。温める処理に、電子レンジ室内を掃除するための処理は書かれていません。温める処理と室内を掃除する処理は全く別の処理だからです。

このように、その機能に関連する処理だけが一つにまとめられて、ユーザが利用しやすいように名前が付けられているものがメソッドとなります。

メソッド名が「温めるボタン」や「電源ボタン」に該当し、メソッドの記述内容が「ボタンが押された時の処理」となります。

 

メソッドを利用する利点

メソッドの書き方を説明する前に、利用する利点について説明します。これから説明する利点は、逆にmain()内に処理内容を細かく記述する時の欠点となります。

プログラムの全体像を把握することができる

main()内に詳細なコードを書かずに、メソッド名を記述しておけば、プログラム全体の流れを把握することができます。

書籍をイメージしてください。書籍は色々なことが詳細に記述されていますが、目次には各章のタイトルだけがまとめられています。目次を見れば、その書籍で記述されている内容の概要を把握することができます。もし、書籍に目次がなく、いきなり文章が記述されていれば、話の流れや全体像を把握することができません。

main()メソッドは、プログラムの目次と言えます。プログラムのmain()メソッドを確認すれば、プログラムの流れを把握できるようにしておきましょう。

 

同じ処理を簡単に再度実行することできる

プログラムには、全く同じ処理を何度か実行しなければならないことがあります。

例えば、 ある整数が奇数か偶数かを判定する処理を3回実行したい場合、メソッドに分けずにmain()メソッド内に記述すると以下のようになります。

このプログラムで、赤い枠線内の処理は対象となる変数名(青枠内)が変わるだけで、その他の処理は全く同じです。この奇数/偶数の判定を100個の整数に対して行う場合、この赤い枠線を100回記述しなければなりません。コピペすれば大丈夫、と考えるかも知れませんが、無駄な記述です。

このように、同じ処理を複数回実行する場合は、その部分をメソッドに分けて記述します。そして、main()メソッドで必要な回数分、そのメソッドを呼び出して実行すれば良いのです。

以下がメソッドに分けた場合のプログラムとなります。メソッドの書き方はこの後説明します。

このように、同じ処理を複数回実行する場合、メソッドに分けて記述すれば、コード量を減らすことができます。また、奇数か偶数かを判定する処理を更に複数回実行したい場合、メソッド名をその回数分記述するだけで済みます。

 

変更が発生した場合、main()内をいじらないので間違いが起きにくい

プログラムは完成後に修正することが多々あります。変更する場合、変更する箇所が少ない方がミスを減らすことができます。人間が手作業でプログラムを変更する場合、変更する個所が多いと不注意で間違えたり、見落としたりしてしまいます。

例えば、上の奇数か偶数かを判定するプログラムで表示するメッセージを「奇数です」「偶数です」と「です」を追加する場合について考えてみましょう。

まず、main()メソッド内に3回同じ処理を記述している場合、修正する個所は合計6か所です。一方、メソッドに分けた場合、修正する個所は2か所だけです。ヒューマンエラーを防ぐためにも、変更箇所を減らすようにプログラムを作成する必要があります。

 

また、main()メソッド内には実行したいメソッド名だけが記述されており、具体的な処理内容はmain()メソッドでは記述されていません。したがって、修正する作業はメソッド側だけとなります。main()メソッドにはシステムを実行するための重要な処理が記述されています。プログラムを修正する場合に関係ない部分を間違えて書き換えてしまう危険性があります。

このような危険性を排除するためにも、main()メソッドから処理をメソッドに分割し、なるべく修正はmain()メソッドではなく、分割したメソッドに対して行うようにしておかなければなりません。

 

処理内容が変わった場合、取り換えが簡単におこなえる

今回、整数が奇数か偶数かを判定するプログラムでは、判定したい整数を変数に初期値で与えています。これを0~100の乱数で求めるようにメソッドに分けて記述するとプログラムは以下のようになります。

生成した乱数の値(0~100)を返すメソッド「getValue()」を別途記述し、main()メソッド内で3回このメソッドを実行しています。

このプログラムでデータの入力部分を「乱数で求める方法」から「キーボードから入力させる方法」に変更する場合、getValue()メソッドの内容だけを変更します。以下が修正後のプログラムです。

メソッドは1つ1つが独立しているので、部品のように簡単に取り換えることができます。取り換える場合は該当するメソッド部分だけを変更するだけで、その他のプログラムは一切手を加える必要がありません。

メソッドに分けて記述することで、処理内容に変更が発生した時でも、他のプログラムを意識せずに編集作業をおこなうことができます。

 

4種類のメソッド

メソッドは、「実行する時に利用する(受け取る)データの有無」と「実行後に返すデータの有無」の違いによって、以下の4種類に分けることができます。まず、メソッドを記述す場合、どの種類のメソッドなのかを把握しておかなければなりません。

種類 受け取るデータの有無 実行後に返すデータの有無
無し 無し
有り 無し
無し 有り
有り 有り

 

種類①:受け取るデータ「無し」、返すデータ「無し」

この種類のメソッドを定義する場合の記述は以下の通りです。

受け取るデータが無い

何かデータを受け取る場合、メソッド名の()内に受け取るデータを保存する変数名を記述する必要があります。しかし、この種類のメソッドはデータを受け取りません。したがって、メソッド名の()内には何も記述しません。

返すデータが無い

メソッドを実行して何かデータを返す場合、メソッド名の前に返すデータのデータ型を記述する必要があります。しかし、この種類のメソッドはデータを返しません。この場合、メソッド名の前に「void」と記述します。「void」は「何もない」という意味です。

サンプル:「Hello World」と表示するメソッド

まず、メソッドは13行目から15行目で定義されています。メソッド名は「showHello()」で「Hello World」を表示する(14行目)だけの処理です。データは何も受け取らないので、showHello()の()内には何も記述していません。また、このメソッドを実行しても何も呼び出し側(8行目)には返さないので「void」と記述しています。

また、このメソッドを実行する側では、実行したい場所でメソッド名を記述します。この際、データは何も渡さないのでメソッド名の()内には何もデータを記述しません。さらに、このメソッドを実行しても何もデータが返されないので、メソッド名だけを記述します(8行目)。

種類②:受け取るデータ「有り」、返すデータ「無し」

この種類のメソッドを定義する場合の記述は以下の通りです。

受け取るデータが有る

この種類のメソッドは、実行する時に何かのデータを受け取ります。メソッド名の()内に受け取るデータの型とデータを保存する変数名を記述します。受け取るデータが複数ある場合、「,」で区切って指定します。受け取るデータの型とここで指定した変数のデータ型が異なる場合、コンパイルエラーとなるので、気を付けましょう。

返すデータが無い

この種類のメソッドはデータを返しません。この場合、メソッド名の前に「void」と記述します。

サンプル:「Hello World」を指定された回数表示する

まず、メソッドは13行目から19行目で定義されています。メソッド名は「showHello()」で「Hello World」を指定された回数表示(17行目)します。このメソッドは表示する回数をデータとして受け取るので、受け取ったデータを保存する変数の情報をshowHello()の()内に記述しています。一方、このメソッドを実行しても何も呼び出し側(8行目)には返さないので「void」と記述しています。

また、このメソッドを実行する側では、実行したい場所でメソッド名を記述します。この際、表示する回数をメソッドに渡すので、メソッド名の()内に渡したいデータを直接記述しています。ここでし記述したデータはメソッドで定義した変数にコピーされて渡されます。一方、このメソッドを実行しても何もデータが返されないので、メソッド名だけを記述します(8行目)。

サンプル:指定された文字列を指定された回数表示する

このサンプルでは、メソッドは2つのデータを受け取ります。最初のデータは表示するメッセージ(文字列)、次のデータは表示する回数(整数)です。複数のデータを受け取る場合は、受け取ったデータを保存する変数を「,」で区切って記述します。また、このメソッドは、何もデータを返さないので、「void」と記述しています。

このメソッドを呼び出す部分(8行目)では、()内に渡すデータを順番に記述します。記述した順番でメソッド名の()内の変数に値が代入されるので、順番は十分注意してください。

種類③:受け取るデータ「無し」、返すデータ「有り」

この種類のメソッドを定義する場合の記述は以下の通りです。

 

受け取るデータが無い

この種類のメソッドは、実行する時に何もデータを受け取りません。したがって、定義しているメソッド名の()内には何も記述しません。

返すデータが有る

この種類のメソッドは、実行すると何らかの値を返します。メソッド内で求めた値を呼び出し側に返す場合、メソッドの最後に「return 返すデータ;」を記述します。返すデータは直接値を記述しても、値が代入されている変数でも、値が求められる計算式でも、何でも構いません。返すデータがあるので、メソッド名の前には戻り値のデータ型を指定する必要があります。

「return文が記述されているのに、返すデータの型が指定されていない(void)」、「返すデータ型が指定されているのに、return文がない」といった場合、コンパイルエラーとなります。

 

return文を利用する場合の注意点があります。

  1. return文の後に何らかの処理をおこなうコードを記述するとコンパイルエラーとなる
  2. return文で返せるデータの個数は1つだけ

return文が実行されると呼び出し側に値を直ぐに返すので、その後の処理は一切実行されません。したがって、何か処理を記述すると「到達不能なエラー」となります。

また、returnで返せる値は1つのみです。2つ以上の値を返したい場合は、配列やオブジェクトを利用する必要があります。この2つ以上の値を返すメソッドについては、別の記事で解説します。

 

サンプル:0~10の乱数を返す

このサンプルでは、メソッドは何もデータを受け取らず、メソッド内で乱数を1つ生成しています。生成した乱数をreturn文で呼び出し側に返しています(21行目)。返す乱数は整数なので、戻り値のデータ型として「int」を指定しています(17行目)。

このメソッドは10行目で実行しています。メソッドを実行し、何かデータが返ってくる場合、その値を変数に代入する必要があります。変数に代入する記述をしていない場合、メソッドを実行して値は返されているのですが、そのデータは消えてなくなります(その後のプログラムで利用することができません)。

10行目では、データを渡さずにメソッド「getNuber()」を実行し、返されたデータを変数「number」に代入しています。これで、メソッドから返された乱数を11行目以降のプログラムで利用できます。

10行目の処理をもう少し詳しく説明します。

①.int  number  =  getNumber();

この1行は変数「number」に「=」の右にあるデータを代入する処理です。この時、代入するデータとしてメソッド「getNubmer()」が記述されているので、まずこのメソッドを実行します。

②.getNumber()メソッドを実行し、0から10の乱数が1つ返されます。例えば、「5」がreturn文で返されます。

③.メソッドの実行結果として値「5」が返されたので、10行目の命令は次のように書き換えられます。

int  number = 5;

④.「=」の右側がメソッド名から具体的な値「5」に書き換えられたので、変数numberに5が代入されて、11行目以降に処理が移ります。

なお、メソッドの値を受け取る変数のデータ型はメソッドで定義された戻り値のデータ型と一致していなければなりません。メソッドからint型のデータが返されるのに、double型の変数で受け取る(代入する)とコンパイルエラーとなります。

 

種類②:受け取るデータ「有り」、返すデータ「有り」

この種類のメソッドを定義する場合の記述は以下の通りです。

受け取る値が有る

この種類のメソッドは、実行する時に何らかのデータを受け取るので、受け取ったデータを保存する変数をメソッド名の()内に記述します。記述する際は受け取るデータの型を適切に指定します。また、複数のデータを受け取る場合、受け取る順番に変数名を記述します。

返すデータが有る

この種類のメソッドは、実行すると何らかのデータを1つ返します。したがって、メソッド名の最後に、return文で返すデータを指定します。また、データを返すのでメソッド名を定義する時にデータ型を適切に記述しておかなければなりません。

宣言した戻り値のデータ型とreturn文で返すデータの型が合わない場合はコンパイルエラーとなります。

サンプル:整数が奇数か偶数かを判定する

このサンプルでは、整数が奇数か偶数かを判定し、文字列を返すメソッドを利用しています。

メソッドは判定したい整数が呼び出し側から渡されるので、int型の変数「value」で受け取るように定義しています。また、判定結果を文字列として呼び出し側に返すので、戻り値のデータ型としてStringを記述しています(15行目)。

 

8行目の処理をもう少し詳しく分析してみます。

①.String  result  =  checkOddEvne(5);

この1行は文字列型(String)の変数「result」に「=」の右側に記述しているメソッド「chekuOddEven()」の戻り値を代入しています。このメソッドを実行する際に整数値「5」をメソッドに渡しています。

また、メソッド「chekuOddEven()」は文字列を返すので、このデータを保存する変数「result」はString型で宣言する必要があります。

 

メソッドを実行するために処理は15行目に移ります。この時、呼び出し側で指定された値「5」が変数「value」に代入されています。18行目でこの変数valueに保存されている値が偶数かどうかを判定しています。偶数かどうかの判定は「2で割った余りが0なら偶数」という条件を利用しています。

変数valueには「5」が保存されているので、2で割った余りは「1」となり条件を満たしません。したがって、20行目のelse部分に処理が移ります。そして、21行目が実行されて、「奇数です」という文字列が呼び出し側に返されます。

②.メソッドを実行した結果、「奇数です」というデータが返されたので、8行目は次のようになります。

String  result = ”奇数です”;

「=」の右側はメソッドを実行した結果の「奇数です」という文字列に置き換えられます。その後、代入処理が行われ、変数resultには「奇数です」という文字列が保存されます。

 

メソッド内で値を返す場合、return文を最後に1つだけ記述するのが一般的な書き方です。しかし、このサンプルではreturn文が2つあります。return文が2つ存在していても大丈夫なのでしょうか?

メソッド内の処理を確認すると、return文が2つ記述されていますが、if文の条件式の結果によって、どちらかのreturn文しか実行されません。このようにreturn文が複数記述されていても、どれか1つけしか実行されない場合は、問題ありません。

 

まとめ

今回は、Java言語で利用されるメソッドの書き方について説明しました。

プログラムを作成する場合、様々な利点があるので、メソッドを積極的に利用したほうが良いでしょう。

メソッドには、「受け取るデータの有無」と「実行後に返すデータの有無」の組み合わせで4種類の記述方法があります。メソッドを記述する場合は、そのメソッドを実行するためには何かデータを受け取る必要があるのか、また実行結果を返すのか、きちんと設計しておく必要があります。

ただメソッドの書き方だけを覚えても、なかなかメソッドを書くことはできません。まずは、どんな処理をメソッドで定義したいのか、じっくり考えて下さい。

 

・メソッドの定義方法は4種類存在する

・メソッドを定義する場合、データを受け取るのか、結果を返すのか考えること

・扱うデータの型を間違えないこと

 

 

続石講師
続石講師

だいぶ詳しく書き方を説明しましたが、どうですか?

太郎さん
太郎さん

一応、メソッドの書き方は理解できたと思います。

ただ、自分でゼロから作る時にきちんと使えるかどうかは不安です。

続石講師
続石講師

書き方を覚えただけでは実際にはメソッドは書けません。

きちんとアルゴリズムなどを考えて、設計する必要があります。

太郎さん
太郎さん

プログラムを記述する前に、じっくり処理内容を考えるように気を付けます。

タイトルとURLをコピーしました