メソッドを使うだけでなく、作成する方法について解説します。
メソッドの基礎についてはこちらを参照ください。
メソッドを記述する位置
メソッドを作成する際の記述場所ですが、今までmain( )メソッドを書いてきたのと同じようにclass{ }の中にメソッドを記述します。
クラス名の後に続く中括弧{…}の外には書けない点に注意してください。
class クラス名{ 戻り値 メソッド名1(引数リスト){ …… } 戻り値 メソッド名2(引数リスト){ …… } }
メソッド作成の基本
メソッドを宣言する書式は以下の通りです。
[アクセス指定子] [static] 戻り値の型 メソッド名(引数リスト){メソッドの中身}
メソッドを作成する際に決定しなくてはならないのは次の3点です。
- メソッドの名前は何か
- どのような引数(型・個数)をとるか
- どのような戻り値をとるか(型)
戻り値の型はどのようなデータ型で処理結果を返すかを指定し、引数リストはどのようなデータ型をもらってくるかを指定します。
メソッド名は処理内容にあった適切な名前をつけます。
引数、戻り値のないメソッド
まずは引数、戻り値のないメソッドを作成してみます。
ここでは話を簡単にする為に「メソッドが呼ばれました」という文字列をコマンドプロンプトの画面に表示するだけのメソッドを作成します。
はじめに決めなくてはならないのがメソッドの名前です。
メソッドの名前をつける場合、いくつか約束事があります。
- 先頭がアルファベット(a~z、A~Z、アンダースコア”_”)で始まる
- 2文字目以降はアルファベット、アンダースコア”_”、ハイフン”-”、数字が使える
この約束事を守ればどのようなメソッド名をつけてもかまいません。
今回は「printHello」という名前のメソッドにします。
このような名前をつけた理由は、「第3者がソースコードを読んだときでも、どのような処理のメソッドなのか、すぐに分かるようにする観点から、メソッド名には処理内容を表す適切な名前をつけなくてはいけない」為です。
それでは、引数、戻り値のないメソッドを実装した以下のソースコードを確認しましょう。
public class MethodPrintHelloSample{ static void printHello( ){ String msg = "メソッドが呼ばれました"; System.out.println(msg); } }
このプログラムはまだエントリポイントとなるmain( )メソッドがありませんので、実行はできません。
メソッドの定義は2~5行目で行っています。
また、2行目で書いてある「void」は戻り値がないことを示しています。
void型
戻り値がない場合、メソッドの宣言の部分で戻り値にvoidを指定します。
本来はこのようなデータ型はないのですが、慣習的に戻り値のないメソッドを、void型を返すメソッドという場合があります。
また、引数がなくてもメソッド名の後には必ず”( )”をつけてください。
メソッドで行う処理の内容はメソッド名( )に続く中括弧”{…}”の間に書きます。
メソッドの中で行っている処理は、String型の変数msgを用意し、「メソッドが呼ばれました」という文字列で初期化して、それをコマンドプロンプトの画面に出力しています。
この状態ではまだメソッドを定義しただけで呼び出してはいません。
次のプログラムでは、エントリポイントとなるmain( )メソッドを用意してこのメソッドを呼び出してみます。
【引数、戻り値のないメソッド】
public class MethodPrintHello{ public static void main(String[ ] args){ printHello( ); // メソッドの呼び出し } // メソッドの定義 static void printHello( ){ String msg = "Hello! メソッドが呼ばれました"; System.out.println(msg); } }
実行結果
Hello! メソッドが呼ばれました
メソッドの呼び出しを行っているのはmain( )メソッドの3行目です。
3行目のメソッドの呼び出しがあるので、プログラムの実行は6行目に移ります。
そして、printHello( )内の7、8、9行目までを実行すると、処理が3行目に戻り、メソッドの呼び出しは既に終了したため、その次の4行目が実行されることになります。
[動画解説]
vimeo.com
引数のあるメソッド
メソッドに何らかのデータを渡すことによって、より柔軟なメソッドを作成することが可能となります。
たとえば、println( )メソッドなども引数のあるタイプのメソッドです。
もし、println( )に対して引数を渡すことができなければ、画面に表示する内容を指定することができないということになってしまいます。
このように柔軟性のあるメソッドを作成するためには、引数が必要不可欠です。
引数のあるメソッドを作成する場合、次の要素を決定しなくてはなりません。
- 引数のデータ型
変数宣言のデータ型と同様です。
どういう型のデータをメソッドに渡す必要があるかを考えます。
- 引数の数
数は任意です。
但し、あまりに引数の数が多くなると、使いづらいメソッドになります。
多くても5つくらい、もしくはそれ以下を目安にしましょう。
- 仮引数名
変数名と同様に、受け取る変数の名前を付けます。
仮引数には、メソッド呼び出しの際に渡された実引数の値がコピーされます。
用語:仮引数と実引数
引数と一口に言っても、メソッドの呼び出し側からみた引数とメソッド側からみた引数では、違うものを指す場合があります。
例えば、下のプログラムを見てください。
4行目のadd( )メソッドを呼び出す側からすれば、引数はnumと5です。
7行目のadd( )メソッドの側からすれば、引数はaとbです。
この場合、メソッドを呼び出す側の引数を「実引数」、メソッド側の引数を「仮引数」と呼んでいます。
引数のコピー
メソッドを呼び出す側から渡された引数(実引数)の値は、メソッド側の引数である仮引数にコピーされます。
上記のプログラムの場合、numに格納されている10という値と、5という値が、それぞれ、add( )メソッドの変数a、bにコピーされます。
従って、8行目のanswerには10 + 5の演算結果が格納されることになります。
スコープ
上記のプログラムで引数の値がコピーされることはわかりましたが、なぜそのような回りくどいことを行うのでしょうか?
numをadd( )メソッドで直接参照すれば話は早そうです。
しかし、それはできません。
メソッド内で宣言された変数はその宣言されたメソッドの中だけで有効だからです。
この有効範囲のことを、「スコープ」と呼びます。
【引数のあるメソッド】
public class MethodPrintHello2{ public static void main(String[ ] args){ printHello( ); // メソッドの呼び出し String msg = "こんにちは、Java"; printMessage(msg); // メソッドの呼び出し } // メソッドの定義 static void printHello( ){ String msg = "Hello! メソッドが呼ばれました"; System.out.println(msg); } // 新たなメソッドの追加 static void printMessage(String greeting){ System.out.println("メソッドから出力 : " + greeting); } }
実行結果
Hello! メソッドが呼ばれました メソッドから出力 : こんにちは、Java
ここでは新たにprintMessageというメソッドを用意しています。
このprintMessageというメソッドは13行目で以下のように宣言されています。
static void printMessage(String greeting){
つまり、このメソッドはString型の引数を1つ取るということです。
仮引数greetingには実引数のコピーが入ります。
引数を渡してメソッドを呼んでいるのは5行目になります。
メソッドが呼ばれると、14行目からの実行となり、内部で記述されているprintln( )で画面出力が行われます。
ポイント!メソッドの引数
メソッドを実行した結果、String型の変数msgに入っていた内容が出力されています。
しかし、メソッドの中ではString型のgreetingという変数名に置き換わっています。
これはmsgに入っていた内容がメソッドの引数のgreetingにコピーされるためです。
[動画解説]
vimeo.com
メソッドの終了
メソッドが終了するのは次の2つの場合です。
- メソッドが定義されているブロックの最後まで処理が達した時
- return文があった時
メソッド内部の実行を途中で終了して、メソッドを呼び出したところまで戻りたい場合があります。
そういった場合は、「return文」を利用します。
例えば、正の値の演算だけをしたいメソッドに負の値を渡された場合、return文でメソッド内の実行を直ちに中止して戻ったりすることができます。
またブロックの1番最後には、return文を書いても、書かなくても同じ処理が行われます。
(メソッドを終了して呼び出し元に戻ります)
【return文】
public class ReturnMethod{ public static void main(String[ ] args){ returnTest(2); // メソッドの呼び出し。問題のない引数 returnTest(-1); // メソッドの呼び出し。問題のある引数 } // メソッドの定義 static void returnTest(int i){ System.out.println("メソッドが呼ばれました。引数は" + i + "です"); if(i < 0){ // まず、引数に問題がないか検査 System.out.println("\t引数の値は0以上にしてください"); return; // ここでメソッドを終了 } System.out.println("\t問題のない引数"); return; // return を省略せずに記述 } }
実行結果
メソッドが呼ばれました。引数は2です 問題のない引数 メソッドが呼ばれました。引数は-1です 引数の値は0以上にしてください
[動画解説]
vimeo.com
【メソッドの作成と呼び出し1】
public class PrintHello{ public static void main(String[ ] args){ int times = 10; String msg = "こんにちは、Java"; // メソッドの呼び出し printMessage(msg, times); } // メソッドの定義 static void printMessage(String str, int i){ for(int j = 0; j < i; j++){ System.out.println(str); } } }
実行結果
こんにちは、Java こんにちは、Java こんにちは、Java こんにちは、Java こんにちは、Java こんにちは、Java こんにちは、Java こんにちは、Java こんにちは、Java こんにちは、Java
[動画解説]
vimeo.com
【メソッドの作成と呼び出し2】
public class CalcSigma{ public static void main(String[ ] args){ int i = 10; executeCalcSigma(i); // メソッドを呼び出し executeCalcSigma(30); // 別の引数でメソッドを呼び出し } // メソッドの定義 static void executeCalcSigma(int i){ int ans = 0; for(int j = i; j != 0; j--){ ans += j; } System.out.println("答えは : " + ans +"です"); } }
実行結果
答えは : 55です 答えは : 465です
[動画解説]
vimeo.com
まとめ
- メソッド作成の基本
メソッドを作成するには、引数、戻り値、メソッド名を決めなくてはなりません。
- 引数、戻り値のないメソッド
戻り値がないメソッドを作成する場合はvoidを返すようにし、メソッド名の後の引数は( )を記述します。
例) void func( );
引数のあるメソッド
引数には仮引数と実引数があります。実引数の中身が仮引数にコピーされます。
実引数と仮引数のデータ型は一致している必要があります。
メソッド内で宣言された変数は他のメソッドから見えないため(スコープ)、引数や戻り値を使ってデータのやりとりを行います。
「メソッドの作成 Part2」に続きます
独学で挫折しそうになったら、オンラインプログラミングスクール