Java 入門

Java メソッドと引数

メソッド(Methods)を活用することで、複雑なタスクをより小さく、管理しやすい断片に分解することができます。そして、引数(Parameters)はメソッドの柔軟性と再利用性を劇的に向上させ、呼び出しのたびに異なるデータを処理することを可能にします。引数がなければ、メソッドは常に同じデータに対して同じ操作しか実行できず、その実用性は大きく制限されてしまいます。

本章では、引数を持つメソッドの定義方法を深く掘り下げ、より汎用的で効率的な Java コードを記述するスキルを身につけます。

1. メソッド引数の理解

引数とは、メソッドが呼び出された際に渡される値を受け取るための変数です。データをメソッド内部に送り込むことで、メソッドを動的かつ再利用可能なものにします。メソッドは、引数を持たないことも、1つまたは複数の引数を持つことも可能です。

1.1 仮引数(Formal Parameters)と実引数(Actual Parameters)

メソッドの引数を学ぶ上で、「仮引数」と「実引数」を区別することは非常に重要です。

  • 仮引数(Formal Parameters / 形参): メソッドの定義時に宣言される変数です。メソッドに渡される値を待ち受けるプレースホルダー(入れ物)として機能します。
  • 実引数(Actual Parameters / Arguments / 実参): メソッドを呼び出す際に、実際に渡す具体的な数値やオブジェクトです。実引数の値は、対応する仮引数に代入されます。

以下の例を見てみましょう:

public class ParameterExample {
    // メソッド定義。仮引数:int num1, int num2 を含む
    public static int add(int num1, int num2) {
        return num1 + num2;
    }

    public static void main(String[] args) {
        // メソッド呼び出し。実引数:5, 10 を渡す
        int sum = add(5, 10);
        System.out.println("合計は: " + sum); // 出力: 合計は: 15
    }
}

この例のポイント:

  • num1num2 は、add メソッドの仮引数です。
  • 510 は、main メソッドで add メソッドを呼び出す際に渡された実引数です。

2. 引数付きメソッドの宣言

引数を持つメソッドを定義するには、メソッド宣言の丸括弧 () 内に、各引数のデータ型と名称を指定します。基本構文は以下の通りです。

<アクセス修飾子> <戻り値の型> <メソッド名>(<データ型> <引数名>, <数据型> <引数名>, ...) {
    // メソッドの本体(実行されるコード)
}
  • <アクセス修飾子>: メソッドの可視性を指定します(例:public, private, protected)。
  • <戻り値の型>: メソッドが返すデータの型を指定します。値を返さない場合は void を使用します。
  • <メソッド名>: メソッドの名前です。
  • <データ型> <引数名>: 各引数の型と名前です。複数の引数がある場合はカンマ , で区切ります。

2.1 2つの整数引数を持つメソッドの例

public class Example1 {
    public static int multiply(int a, int b) {
        return a * b;
    }

    public static void main(String[] args) {
        int result = multiply(7, 3);
        System.out.println("積は: " + result); // 出力: 積は: 21
    }
}

2.2 文字列と整数の引数を持つメソッドの例

public class Example2 {
    public static void printMessage(String message, int count) {
        for (int i = 0; i < count; i++) {
            System.out.println(message);
        }
    }

    public static void main(String[] args) {
        printMessage("こんにちは、世界!", 3);
        // 出力:
        // こんにちは、世界!
        // こんにちは、世界!
        // こんにちは、世界!
    }
}

2.3 異なるデータ型の複数の引数を持つメソッドの例

public class Example3 {
    public static String createGreeting(String name, int age, String city) {
        return "こんにちは、私の名前は " + name + " です。現在 " + age + " 歳で、" + city + " に住んでいます。";
    }

    public static void main(String[] args) {
        String greeting = createGreeting("アリス", 30, "ニューヨーク");
        System.out.println(greeting); // 出力: こんにちは、私の名前は アリス です。現在 30 歳で、ニューヨーク に住んでいます。
    }
}

3. 引数のデータ型

引数には、Java の有効なあらゆるデータ型を使用できます。

  • プリミティブ型: int, float, double, boolean, char, byte, short, long
  • 参照型: String, 配列, クラスのオブジェクト

3.1 double型引数を持つメソッドの例

public class Example4 {
    public static double calculateSquareRoot(double number) {
        return Math.sqrt(number);
    }

    public static void main(String[] args) {
        double result = calculateSquareRoot(25.0);
        System.out.println("平方根は: " + result); // 出力: 平方根は: 5.0
    }
}

3.2 boolean型引数を持つメソッドの例

public class Example5 {
    public static void checkEligibility(int age, boolean hasConsent) {
        if (age >= 18 || hasConsent) {
            System.out.println("資格あり");
        } else {
            System.out.println("資格なし");
        }
    }

    public static void main(String[] args) {
        checkEligibility(16, true);  // 出力: 資格あり
        checkEligibility(16, false); // 出力: 資格なし
        checkEligibility(20, false); // 出力: 資格あり
    }
}

3.3 配列引数を持つメソッドの例

public class Example6 {
    public static int sumArray(int[] numbers) {
        int sum = 0;
        for (int number : numbers) {
            sum += number;
        }
        return sum;
    }

    public static void main(String[] args) {
        int[] myArray = {1, 2, 3, 4, 5};
        int result = sumArray(myArray);
        System.out.println("配列の合計は: " + result); // 出力: 配列の合計は: 15
    }
}

4. メソッドへの引数の受け渡し

引数を持つメソッドを呼び出す際、提供する実引数は、メソッド定義内の仮引数の数、型、順序と完全に一致している必要があります。

4.1 引数型のマッチング

各実引数のデータ型は、対応する仮引数の型と互換性がなければなりません。Java では自動型変換(拡大変換/アップキャスト)が行われる場合もありますが、基本的には型を厳密に合わせるのがベストプラクティスです。

暗黙的な型変換(自動変換)の例:

public class Example7 {
    public static void printDouble(double number) {
        System.out.println("この数値は: " + number);
    }

    public static void main(String[] args) {
        int num = 10;
        printDouble(num); // int から double へ暗黙的に変換される
        // 出力: この数値は: 10.0
    }
}

明示的な型変換(キャスト)の例:

public class Example8 {
    public static int multiply(int a, int b) {
        return a * b;
    }

    public static void main(String[] args) {
        double x = 5.5;
        double y = 2.5;
        // double を明示的に int へキャスト(端数切り捨て)
        int result = multiply((int) x, (int) y); 
        System.out.println("積は: " + result); // 出力: 積は: 10
    }
}

4.2 引数の順序

メソッド呼び出し時の実引数の順序は、定義時の仮引数の順序と一字一句同じである必要があります。

正しい順序の例:

public class Example9 {
    public static String formatName(String firstName, String lastName) {
        return lastName + ", " + firstName;
    }

    public static void main(String[] args) {
        String formattedName = formatName("Alice", "Smith");
        System.out.println(formattedName); // 出力: Smith, Alice
    }
}

順序を間違えると、出力結果が不正になったり(論理エラー)、型が不一致の場合はコンパイルエラーとなります。

5. 実践演習

これまでに学んだ引数付きメソッドの定義を復習するために、実用的な例をいくつか見てみましょう。

5.1 長方形の面積を計算する

public class RectangleArea {
    public static double calculateArea(double length, double width) {
        return length * width;
    }

    public static void main(String[] args) {
        double area = calculateArea(10.5, 5.0);
        System.out.println("長方形の面積は: " + area); // 出力: 長方形の面積は: 52.5
    }
}

5.2 数値が偶数かどうかを判定する

public class EvenNumberChecker {
    public static boolean isEven(int number) {
        return number % 2 == 0;
    }

    public static void main(String[] args) {
        boolean even1 = isEven(10);
        boolean even2 = isEven(7);
        System.out.println("10 は偶数か: " + even1); // 出力: 10 は偶数か: true
        System.out.println("7 は偶数か: " + even2);  // 出力: 7 は偶数か: false
    }
}

5.3 摂氏(Celsius)を華氏(Fahrenheit)に変換する

public class TemperatureConverter {
    public static double celsiusToFahrenheit(double celsius) {
        return (celsius * 9 / 5) + 32;
    }

    public static void main(String[] args) {
        double fahrenheit = celsiusToFahrenheit(25.0);
        System.out.println("摂氏 25 度は華氏 " + fahrenheit + " 度です"); // 出力: 摂氏 25 度は華氏 77.0 度です
    }
}