Revised: Dec./28th/2001: Since: Dec./28th/2001
先に、メソッドが何であるのかまとめてあります。ここからはその利用法について、サンプルを通してみていきます。
メソッドはクラスのメンバーであり、オブジェクトを操作するとは、メソッド呼び出しと言うメッセージを送ることです。複数のオブジェクト間でメッセージが交換されることで、全体の処理が進んでいきます。
本稿では、オブジェクトが、自分自身がインスタンス化されたクラス内部で定義されたメソッドを利用する場合を考えます。オブジェクト自信の機能を自分で使うことになります。
main()
メソッドから、同じクラスに含まれる別のメソッドを利用してみましょう。
TestMethod.java
:
class TestMethod{ //main() メソッド public static void main(String args[]){ String st; //戻り値を受ける為の変数 //メソッド呼び出し methodA(); st=methodB("Start Method B"); System.out.println(st); System.out.println("Application END..."); } //メソッド static void methodA(){ System.out.println("Method A Start..."); } //メソッド static String methodB(String arg){ System.out.println(arg); return "Method B End..."; } }
ここでは、 main()
メソッドの他に、二つのメソッド methodA()
と methodB()
が定義されており、 main()
メソッドからメッセージが送られています(=呼び出されています)。
methodA()
は戻り値なし (void
)、引数無しです。
methodB()
は、戻り値のデータ型が String
型で、引数は String
型の変数 arg
で受けています。
main()
メソッドからメッセージは、 methodA()
に対しては、メソッド名を記述しているだけです: methodA();
。ここで methodA()
に制御が移り、最後まで終了すれば自動的に元のメソッドである main()
メソッドに制御が戻ります。
methodB()
に対しては、引数が与えられています: methodB("Start Method B")
。ここで制御は methodB()
に移り、同時に文字列 "Start Method B"
が渡されます。この引数は methodB()
では変数 arg
で受け取られます。 methodB()
は文字列型の戻り値が宣言されており、元のメソッドに制御を戻す (return
) ときに文字列 "Method B END..."
を返します。呼び出し元の main()
メソッドでは、この戻り値は変数 st
で受けています。
C:\Java>javac TestMethod.java C:\Java>java TestMethod Method A Start... Start Method B Method B End... Application END...
実行結果4行のうち、最初の一行目は methodA()
のものです。次の行は methodB()
のもの、続く二行は main()
メソッドのものです。
ソースと実行結果を比べてみてください。
本節で扱ったサンプルは、同じクラス内のメソッドの利用に付いてでした。次に、別のクラスのメソッドの利用、即ち、メソッドを介したオブジェクトの操作について紹介します。その前に、同じクラス内でメソッドを分けるメリットについて考えてみましょう。
変数のスコープの話をここでもう一度しておきます。ここでは一つのクラスに三つのメソッドを定義しました。それぞれのメソッド内で変数が定義されていますが、これらは「一時変数」とか「ローカル変数」と呼ばれるもので、当該メソッド内部でしか有効ではありません。逆にいえば、別のメソッド内で定義された変数名と同じ変数名で、全く別の変数を定義できると言うことです。
大きなプログラム中では変数が大量に作る必要があります。そのとき、あちこちで定義していると、変数名のバッティングが頻繁に起こります。これはコンパイル・エラー、実行時エラー(例外)を起こさないかもしれませんが、実行結果が意図した通りにならないでしょう。このようなエラーを論理エラーと呼びます。
この論理エラーと言う奴は、なかなかオチャメな奴で……この段階のバグフィックスって、ホンット大変なんだわ。結局、コーディング時に論理エラーを出さないようにするのが一番簡単という事になります。
論理エラーを避ける為には、開発プログラムを小さくすれば良いのですが、そのための方法の一つが、メソッドを細かく分けることです。 main()
メソッドは別のメソッドの呼び出しと制御構造の記述だけに特化して、具体的な処理は個々のメソッドを別途作成するようにすると良いでしょう。
そうすれば、メソッド内で定義した変数のスコープは当該メソッド内にしか及ばないので、変数名のバッティングも起こりません。複数のメソッドやクラスで共通に利用したい変数は、メンバ変数で定義するか、引数として授受すると良いでしょう。
複数人での開発時にも、メソッドやクラスに分割しておくことは有意義です。貴方の作ったクラスを二次利用する場合、必要なメソッドの引数(Input: 入力)と戻り値(Output: 出力)だけ知っていれば良いわけです。