Java入門の第16回です。前回からの続きですが、今回だけでも分かる内容になっています。
今回は、メソッドへ渡す引数にあらためて注目します。メソッドへ渡す引数には基本型と参照型があります。それぞれの違いについて理解を深めましょう。
1. メソッドの引数としてint型やString型の値を渡す
まず、メソッドの引数としてint型やString型の値を渡す実例を見てみましょう。
public class Test16 {
    //int型の引数をメソッドに渡す
    public static void printNum(int num) {
        System.out.println("引数「" + num + "」を受け取りました");
    }
    //String型の引数をメソッドに渡す
    public static void printText(String text) {
        System.out.println("引数「" + text + "」を受け取りました");
    }
    //メインメソッド(ここからプログラムが実行される)
    public static void main(String[] args) {
        printNum(3);
        printText("ABC");
    }
}
上記コードでは、メソッドにint型やString型の引数を渡しています。引数を受け取ったメソッド側では、受け取った値をそのままprintln()で画面表示しています。
上記コードを実行すると、コンソールには以下のように表示されます。
引数「3」を受け取りました 引数「ABC」を受け取りました
以下は、上記コードをEclipseで実行した結果画面です。

2. メソッドの引数として配列を渡す
次に、メソッドの引数として配列を渡す実例を見てみましょう。
public class Test17 {
    //int型の配列を引数としてメソッドに渡す
    public static int getAverage(int[] scores) {
        int sum = 0 ;
        for(int i = 0; i < scores.length; i ++){
            sum = sum + scores[i];
        }
        int average = sum / scores.length;
        return average;
    }
    //メインメソッド(ここからプログラムが実行される)
    public static void main(String[] args) {
        int [] scores = {72, 68, 87, 78, 62, 55, 48, 63, 70, 95};
        int average = getAverage(scores);
        System.out.println("平均値は「" + average + "」です");
    }
}
上記コードでは、 メソッドにint型の配列を引数として渡しています。引数を受け取ったメソッド側では、受け取った配列をforループで回して合計、平均値を算出した後、その平均値を戻り値として返しています。
上記コードを実行すると、コンソールには以下のように表示されます。
平均値は「69」です
以下は、上記コードをEclipseで実行した結果画面です。

3. メソッドの引数としてインスタンスを渡す
次に、メソッドの引数としてインスタンスを渡す実例を見てみましょう。
class Point {
    int x;
    int y;
}
public class Test18 {
    public static void printZahyo(Point zahyo) {
        System.out.print("座標は(");
        System.out.print(zahyo.x);
        System.out.print(",");
        System.out.print(zahyo.y);
        System.out.print(")です");
    }
    public static void main(String[] args) {
        //インスタンスを生成
        Point zahyo = new Point();
        zahyo.x = 4;
        zahyo.y = 6;
        printZahyo(zahyo);
    }
}
上記コードでは、Pointクラスからzahyoインスタンスを生成して、そのzahyoインスタンスを引数にしてprintZahyo()メソッドを呼び出しています。
上記コードを実行すると、コンソールには以下のように表示されます。
座標は(4,6)です
以下は、上記コードをEclipseで実行した結果画面です。

引数の渡し方には【基本型】と【参照型】がある
ここまで、引数を渡す実例を3パターン確認しました。
- メソッドの引数としてint型やString型の値を渡す
- メソッドの引数として配列を渡す
- メソッドの引数としてインスタンスを渡す
上記の3パターンを解説した際には、いずれも「引数を渡す」と同じ表現で解説しましたがが、実は引数の渡し方には【基本型】と【参照型】の2種類があります。
- 【基本型】…… int, double, boolean, String などの型の値は、「値そのもの」が渡される
- 【参照型】…… 配列やインスタンスは、所在地を示す「参照」が渡される
上記の3パターンを【基本型】と【参照型】に分類すると、以下の通りです。
- メソッドの引数としてint型やString型の値を渡す → 【基本型】
- メソッドの引数として配列を渡す → 【参照型】
- メソッドの引数としてインスタンスを渡す → 【参照型】
基本型の値を引数として渡す場合には、「値そのもの」が渡されます。
一方、配列やインスタンスを引数として渡す場合には、配列やインスタンスそのものではなく、配列やインスタンスの所在地を示す「参照」が渡されます。
「値そのもの」を引数として渡す基本型
基本型の引数渡しでは、呼び出し元から呼び出し先へ「値そのもの」が渡されています。
そのため、引数として渡された先のメソッド内で値が変更されても、呼び出し元の変数の値には影響しません。
public static int oneupNum(int num) {
    num++;
    return num;
}
public static void main(String[] args) {
    int num = 3;
    System.out.println(oneupNum(num));    //「4」と表示される
    System.out.println(num);    //「3」と表示される
}
上記コードでは、oneupNum()に渡された引数numの値が「4」に変更されても、呼び出し元の変数numの値は「3」のままです。
「参照」を引数として渡す参照型
上記の基本型の引数渡しは、特に注意を払わなくても理解しやすいかもしれません。注意が必要なのは、配列やインスタンスを渡す際の参照型の引数渡しです。
参照型の引数渡しでは、引数が渡されるメソッドには配列やインスタンスそのものではなく、配列やインスタンスの所在地を示す「参照」が渡されています。
そのため、引数として渡された先のメソッド内で参照先の値が変更されると、呼び出し元にもそれが影響します。これは、呼び出し元でも同じ参照先の値を利用しているためです。
メソッドの引数に配列を渡した場合
メソッドの引数に配列を渡した場合を実例で確認してみましょう。
public static void mantenScore(int[] scores) {
	scores[0] = 100;    //配列の参照先の値を変更している
}
public static void main(String[] args) {
	int [] scores = {72, 68, 87, 78, 62, 55, 48, 63, 70, 95};
	System.out.println(scores[0]);    //「72」と表示される
	mantenScore(scores);    //メソッドを呼び出して実行する
	System.out.println(scores[0]);    //「100」と表示される
}
上記コードでは、 mantenScore()メソッドが実行されると配列の参照先の値が変更されるので、呼び出し元のmain()メソッドでもその影響を受けることになります。
mantenScore()メソッドが実行された後にmain()メソッドから配列を参照すると、すでに値が変更されています。mantenScore()メソッド実行前には「72」であったスコアが、mantenScore()メソッド実行後には「100」となっています。
メソッドの引数にインスタンスを渡した場合
次に、メソッドの引数にインスタンスを渡した場合を実例で確認してみましょう。
class Point {
    int x;
    int y;
}
public class Test19 {
    public static void twiceZahyo(Point zahyo) {
        zahyo.x = 8;    //参照先の値を変更している
        zahyo.y = 12;    //参照先の値を変更している
    }
    public static void main(String[] args) {
        //インスタンスを生成
        Point zahyo = new Point();
        zahyo.x = 4;
        zahyo.y = 6;
        twiceZahyo(zahyo);    //呼び出し実行すると参照先の値が変更される
        System.out.print("座標は(");
        System.out.print(zahyo.x);    //「4」ではなく「8」と表示される
        System.out.print(",");
        System.out.print(zahyo.y);    //「6」ではなく「12」と表示される
        System.out.print(")です");
    }
}
上記コードでは、twiceZahyo()メソッドが実行されるとインスタンスの参照先の値が変更されるので、呼び出し元のmain()メソッドでもその影響を受けることになります。
twiceZahyo()メソッドが実行された後にmain()メソッドからインスタンスを参照すると、すでに値が変更されています。main()メソッド内では座標(4, 6)と指定しましたが、twiceZahyo()メソッド実行後には座標(8, 12) となっています。
次回へ続きます。


