2015年9月17日木曜日

メソッドとはなにか 引数があるメソッドおよび「引数に配列を渡す」

メソッドについてはすでにお話ししました。ここではメソッドについて、より詳しく話してみたいと思います。基本的な使い方については前回の話を見るとなんとなくわかると思います。

メソッドには「インスタンスメソッド」と「クラスメソッド」の2種類があります。基本的な記述の仕方はどちらも同じです。

基本的にはメソッドは次のように記述されます(ただし、「void」がついているのでこれは値を返さないメソッドです)。
private static void method(){ 
  /* メソッド内で実行する処理 */ 
}
このようにメソッドを定義するとプログラムのなかでそのメソッドを呼び出すことができます。メソッドの呼び出しは次のように行います。
変数 = メソッド名(値1, 値2, ....);

実際に書いてみる

実際にコードを書いてみて具体的にメソッドとはどんな働きをするのかを見てみましょう。まず簡単なメソッドを書いてみます。
class Test{
    public static void main(String args[]){
    methoddayo();    // これがメソッド
    } 
    private static void methoddayo(){   //メソッドの定義
    System.out.println("メソッドを使っています。");
    }

}
赤いのがメソッドです。青いのがこのメソッドの内容です。簡単ですね。




class Test{
    public static void main(String args[]){ //これはメインメソッド
    methoddayo();  
    } 
    private static void methoddayo(){
    System.out.println("メソッドを使っています。");
    }
}
ちなみにこのmainがついているコードのかたまりもメソッドです。これはメインメソッドと呼ばれ、プログラムの最初に呼び出されるメソッドです。上記の赤いのがメインメソッドですね。

引数があるメソッド

引数があるメソッドの場合、ちょっと違った記述の仕方をします。簡単なコードを書いて具体的にみてみましょう。
class Test{
    public static void main(String args[]){
    methoddayo(1, 3);
    } 
    private static void methoddayo(int hikisuu1, int hikisuu2){
    System.out.println("hikisuu1 + hikisuu2 = " + (hikisuu1 + hikisuu2));
    }
}
青い部分を見てください。メソッドの引数が設定されていることが分かると思います。次に赤い部分を見てください。これはメソッドですが、1と3が引数として設定されています。これを実行するとメソッド内部の計算・結果の表示が実行されます。


class Test{
    public static void main(String args[]){
    methoddayo(1, 3);
    methoddayo(30, 44);
    methoddayo(1040, 3456);    
    }

    private static void methoddayo(int hikisuu1, int hikisuu2){
    System.out.println("hikisuu1 + hikisuu2 = " + (hikisuu1 + hikisuu2));
    System.out.println("hikisuu1 - hikisuu2 = " + (hikisuu1 - hikisuu2));
    System.out.println("hikisuu1 * hikisuu2 = " + (hikisuu1 * hikisuu2) + "\n");
    }
}

メソッドはクラスのなかで上のように何度でも呼び出すことができますし、内容も追加・変更が容易に行うことができます(ちなみにメソッドの青い部分の最後のほうに書いてある \n は改行の意味です)。これを実行すると次のような結果になります。


引数に配列を渡す

引数に配列を渡す場合はどうすればいいでしょうか。引数に配列を渡す場合には、次のような記述をします。
class Test{
    public static void main(String args[]){
        int arraydayo[] = {1, 2, 4, 6, 0, 9};
        methoddayo(arraydayo);
    } 
    private static void methoddayo(int arraydayo[]){
        System.out.println(arraydayo[0]);
        System.out.println(arraydayo[1]);
        System.out.println(arraydayo[2]);
    }
}

これでメソッド「methoddayo」を実行すると、引数の配列、1,2,3番目を表示します。

注意すべきは、メソッドの引数に配列変数を指定した場合、配列の場所の位置が引数に代入されるので、メソッド側で配列の要素の値を変更すると呼び出し元の配列の要素の値も変更されるということです。
class Test{
    public static void main(String args[]){
        int num = 5;
        int arraydayo[] = {1, 2, 4, 6, 0, 9}; 
        System.out.println(num);
        System.out.println(arraydayo[0]); 
        methoddayo(num, arraydayo); 
        System.out.println(num);
        System.out.println(arraydayo[0]);
    }

    private static void methoddayo(int num, int arraydayo[]){
        num = 100;
        arraydayo[0] = 100;

    }
}
上記のクラスではメソッドによって、int型の変数「num」とint型の配列変数「arraydayo」に荒らしい値を代入しています。int型の変数「num」は値がコピーされて引数に代入されるだけなので、メソッド側で変数の値を変更しても呼び出し元の変数の値には何も影響しません。それに対して配列変数「arraydayo」は配列の場所の位置が引数に代入されるので、メソッド側で配列の
要素の値を変更すると呼び出し元の配列の要素の値も変更されます。

プログラムを実行すると以下のようになります。配列変数だけ、1度目の表示と2度目の表示で値が変わっているのがわかりますね。