Javaのメソッド基礎

2025-08-01

はじめに

Javaプログラミングにおいて、メソッドの理解はオブジェクト指向プログラミング(OOP)への重要な第一歩です。この記事では、すでにJavaの基本文法を理解している方を対象に、メソッドの定義方法や利用方法について詳しく解説します。

メソッドを学ぶことで、プログラムの再利用性や保守性が大きく向上します。コードを整理して構造化できるため、後から修正や拡張を行いやすくなります。また、複雑な問題を小さな単位に分けて解決できるようになることで、効率的に開発を進められます。メソッドの理解は、より高度で柔軟なプログラム設計を行うための基礎となります。

メソッドの基本

メソッドとは?

メソッドは、特定のタスクを実行するためのコードのブロックです。複数の操作を1つにまとめ、名前を付けて繰り返し利用できるようにします。

メソッドの定義構文

Javaのメソッドは、特定の処理をまとめて定義し、必要なときに呼び出せるようにしたブロックです。定義構文は、まずアクセス修飾子(publicなど)で利用範囲を指定し、必要に応じてstaticを付けます。次に戻り値の型を記述し、メソッド名と引数を括弧内に書きます。メソッド本体 {} 内には処理内容を記述し、戻り値のあるメソッドではreturn文で結果を返します。戻り値が不要な場合はvoidを指定し、return文は省略できます。

[アクセス修飾子] [static] 戻り値の型 メソッド名(パラメータリスト) {
    // メソッドの処理
    return 戻り値; // voidの場合は不要
}

具体例:簡単な加算メソッド

次のコードは、Javaで定義されたaddという名前のメソッドです。publicはどこからでも呼び出せることを示すアクセス修飾子、staticはインスタンスを生成せずに呼び出せることを意味します。戻り値の型intは、このメソッドが整数値を返すことを示しています。(int a, int b)は引数リストで、2つの整数を受け取ります。メソッド本体ではa + bの計算結果をreturn文で返し、呼び出し元でその値を利用できます。

public static int add(int a, int b) {
    return a + b;
}

メソッドの呼び出し

次のコードは、先に定義したaddメソッドを呼び出してその結果を利用する例です。add(5, 3)の呼び出しによって、引数53がメソッドに渡され、計算結果の8が返されます。その戻り値が変数resultに代入され、System.out.println("5 + 3 = " + result);で「5 + 3 = 8」と出力されます。このようにメソッドを使うことで、同じ処理を繰り返し利用でき、プログラムの見通しが良くなります。定義したメソッドは、次のように呼び出せます。

int result = add(5, 3);  // resultには8が代入される
System.out.println("5 + 3 = " + result);

様々なメソッドの例

戻り値なし(void)のメソッド

次のコードは、Javaで定義されたgreetという名前のメソッドです。publicはどこからでも呼び出せるアクセス修飾子、staticはクラスをインスタンス化せずに直接呼び出せることを意味します。戻り値の型がvoidのため、値を返さないメソッドです。引数としてString nameを受け取り、メソッド内ではSystem.out.printlnを使って「こんにちは、〇〇さん!」という挨拶メッセージを画面に出力します。このように引数を使うことで、呼び出し時に異なる名前を渡して動的にメッセージを表示できます。

public static void greet(String name) {
    System.out.println("こんにちは、" + name + "さん!");
}

複数のパラメータを持つメソッド

次のコードは、体重と身長からBMI(体格指数)を計算するcalculateBMIというメソッドを定義しています。publicはどこからでも呼び出せることを示し、staticはクラスをインスタンス化せずに直接利用できることを意味します。戻り値の型doubleは、小数を含む結果を返すことを示します。引数としてweight(体重)とheight(身長)を受け取り、weight / (height * height)という式でBMIを算出し、その値をreturn文で呼び出し元に返します。このようにメソッドを使うことで、再利用性の高い計算処理を簡潔にまとめられます。

public static double calculateBMI(double weight, double height) {
    return weight / (height * height);
}

条件分岐を含むメソッド

次のコードは、点数に応じて成績を判定するjudgeGradeというメソッドを定義しています。publicはどこからでも呼び出せるアクセス修飾子、staticはインスタンス化せずに利用できることを示します。戻り値の型Stringは、このメソッドが文字列を返すことを意味します。引数int scoreで点数を受け取り、条件分岐if文を使って点数の範囲に応じた成績(A〜F)を返します。たとえば、scoreが85なら「B」、59なら「F」が戻り値として返されます。条件ごとにreturn文を用いることで、簡潔に判定結果を返す構造になっています。

public static String judgeGrade(int score) {
    if (score >= 90) return "A";
    else if (score >= 80) return "B";
    else if (score >= 70) return "C";
    else if (score >= 60) return "D";
    else return "F";
}

メソッドの活用テクニック

オーバーロード(多重定義)

Javaのオーバーロード(多重定義)とは、同じメソッド名であっても、引数の数や型、並び順が異なる複数のメソッドを定義できる仕組みです。これにより、同じ処理の目的を持つメソッドを柔軟に使い分けることができます。たとえば、引数が1つの場合と2つの場合で異なる処理を行うように定義すれば、呼び出し時に与える引数の形式に応じて自動的に適切なメソッドが選択されます。オーバーロードを利用することで、コードの可読性や再利用性が向上し、より直感的で扱いやすいプログラム設計が可能になります。

次のコードは、Javaのメソッドオーバーロード(多重定義)の例を示しています。すべてmaxという同じ名前のメソッドですが、引数の型や数が異なるため、コンパイラは呼び出し時の引数に応じて適切なメソッドを自動的に選択します。

public static int max(int a, int b) {
    return a > b ? a : b;
}

public static double max(double a, double b) {
    return a > b ? a : b;
}

public static int max(int a, int b, int c) {
    return max(max(a, b), c);
}

最初のメソッドは2つのint値を比較して大きい方を返し、2つ目は同様にdouble型に対応します。3つ目のメソッドは3つのint値を受け取り、内部で最初のmaxメソッドを呼び出して最も大きい値を求めます。
このようにオーバーロードを使うことで、同じ目的の処理を異なる引数パターンで柔軟に扱うことができ、コードの統一性と可読性が向上します。

再帰メソッド

再帰メソッドとは、自分自身を呼び出すメソッドのことです。ある大きな問題を、同じ構造を持つより小さな問題に分割して解く際に利用されます。再帰では、処理を繰り返すための**終了条件(ベースケース)**を必ず設定し、無限に呼び出しが続かないようにします。例えば、階乗(n!)やフィボナッチ数列の計算など、同じ処理を段階的に繰り返す問題に適しています。再帰を使うことで、複雑な繰り返し処理を簡潔でわかりやすいコードとして表現できます。

次のコードは、再帰を使って階乗(factorial)を計算するメソッドの例です。factorialメソッドは引数nを受け取り、nが1以下の場合は1を返して再帰呼び出しを終了します(これがベースケースです)。

public static int factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

それ以外の場合は、n * factorial(n - 1)を計算し、自分自身を呼び出して階乗を求めます。たとえば、factorial(5)を呼び出すと、5 * 4 * 3 * 2 * 1の計算が再帰的に行われ、最終的に120が返されます。このように再帰は、同じ処理を繰り返す構造を自然に表現できる方法です。

可変長引数

可変長引数(かへんちょうひきすう)とは、メソッドの引数の数を呼び出し時に可変(自由)にできる仕組みのことです。通常のメソッドでは引数の数が固定されていますが、可変長引数を使うと、同じ型の引数を0個以上いくつでも渡すことができます。Javaでは、型の後ろに...(3つのドット)を付けて宣言します。

次のコードは、可変長引数を利用して平均値を計算するaverageメソッドの例です。引数int... numbersは、任意の数の整数を受け取ることができ、メソッド内では配列として扱われます。

public static double average(int... numbers) {
    int sum = 0;
    for (int num : numbers) {
        sum += num;
    }
    return (double)sum / numbers.length;
}

// 使用例
double avg1 = average(1, 2, 3);       // 2.0
double avg2 = average(5, 10, 15, 20); // 12.5

for-each文で全ての要素を順に取り出して合計し、最後にnumbers.lengthで要素数を割ることで平均を求めています。戻り値の型がdoubleなので、小数点を含む正確な結果が得られます。例えば、average(1, 2, 3)2.0average(5, 10, 15, 20)12.5を返します。可変長引数を使うことで、引数の数が異なる呼び出しにも柔軟に対応できます。

まとめ

メソッドは、特定の処理やタスクをまとめて実行するためのコードブロックであり、プログラムの再利用性と効率性を高めます。インスタンスメソッドはオブジェクトの状態を操作し、スタティックメソッドはクラスのインスタンスを生成せずに呼び出すことができます。ゲッターやセッターを通じてデータの取得や変更を安全に行うことも可能です。メソッドの理解は、保守性の高いコードを書くための基本であり、Javaプログラミングにおいて非常に重要な要素です。

演習問題

初級レベル(3問)解答例

問題1:基本的なメソッドの宣言と呼び出し

// 2つの整数を受け取り、その和を返すメソッドaddを作成し、mainメソッドで呼び出してください
public class Main {
    // addメソッドをここに宣言

    public static void main(String[] args) {
        // addメソッドを呼び出して結果を表示
    }
}

問題2:戻り値のないメソッド

// 名前を受け取って「Hello, [名前]!」と表示するメソッドgreetを作成してください
public class Main {
    // greetメソッドをここに宣言

    public static void main(String[] args) {
        greet("太郎");
        greet("花子");
    }
}

問題3:複数の引数を持つメソッド

// 3つの整数を受け取り、その平均値を返すメソッドcalculateAverageを作成してください
public class Main {
    // calculateAverageメソッドをここに宣言

    public static void main(String[] args) {
        double result = calculateAverage(10, 20, 30);
        System.out.println("平均値: " + result);
    }
}

中級レベル(6問)解答例

問題4:メソッドのオーバーロード(引数の数が異なる)

// 以下の2つのメソッドをオーバーロードで作成してください
// 1. 2つの整数の最大値を返すmaxメソッド
// 2. 3つの整数の最大値を返すmaxメソッド
public class Main {
    // 2つのmaxメソッドをここに宣言

    public static void main(String[] args) {
        System.out.println("2つの最大値: " + max(5, 10));
        System.out.println("3つの最大値: " + max(5, 10, 3));
    }
}

問題5:メソッドのオーバーロード(引数の型が異なる)

// 以下の2つのメソッドをオーバーロードで作成してください
// 1. 2つのint型の積を返すmultiplyメソッド
// 2. 2つのdouble型の積を返すmultiplyメソッド
public class Main {
    // 2つのmultiplyメソッドをここに宣言

    public static void main(String[] args) {
        System.out.println("intの積: " + multiply(3, 4));
        System.out.println("doubleの積: " + multiply(3.5, 2.5));
    }
}

問題6:booleanを返すメソッド

// 整数を受け取り、それが偶数かどうかを判定するメソッドisEvenを作成してください
public class Main {
    // isEvenメソッドをここに宣言

    public static void main(String[] args) {
        System.out.println("10は偶数: " + isEven(10));
        System.out.println("7は偶数: " + isEven(7));
    }
}

問題7:可変長引数を使用したメソッド

// 可変長引数を使用して、任意の個数の整数の合計を計算するメソッドsumを作成してください
public class Main {
    // sumメソッドをここに宣言

    public static void main(String[] args) {
        System.out.println("合計1: " + sum(1, 2, 3));
        System.out.println("合計2: " + sum(10, 20, 30, 40, 50));
        System.out.println("合計3: " + sum(5));
        System.out.println("合計4: " + sum()); // 0を返す
    }
}

問題8:メソッドのネスト呼び出し

// 以下のメソッドを作成し、mainメソッドで組み合わせて使用してください
// 1. 摂氏温度を華氏温度に変換するcelsiusToFahrenheitメソッド
// 2. 華氏温度を摂氏温度に変換するfahrenheitToCelsiusメソッド
public class Main {
    // 2つのメソッドをここに宣言

    public static void main(String[] args) {
        double celsius = 25.0;
        double fahrenheit = celsiusToFahrenheit(celsius);
        double convertedBack = fahrenheitToCelsius(fahrenheit);

        System.out.println(celsius + "°C = " + fahrenheit + "°F");
        System.out.println(fahrenheit + "°F = " + convertedBack + "°C");
    }
}

問題9:配列を引数とするメソッド

// 整数配列を受け取り、その中の最大値を返すメソッドfindMaxを作成してください
public class Main {
    // findMaxメソッドをここに宣言

    public static void main(String[] args) {
        int[] numbers = {12, 45, 23, 67, 34, 89};
        int max = findMax(numbers);
        System.out.println("配列の最大値: " + max);
    }
}

上級レベル(3問)解答例

問題10:再帰的メソッド(階乗計算)

// 再帰的メソッドを使用して、非負整数nの階乗を計算するメソッドfactorialを作成してください
// 階乗の定義: factorial(0) = 1, factorial(n) = n * factorial(n-1)
public class Main {
    // factorialメソッドをここに宣言

    public static void main(String[] args) {
        System.out.println("5! = " + factorial(5));
        System.out.println("0! = " + factorial(0));
        System.out.println("3! = " + factorial(3));
    }
}

問題11:再帰的メソッド(フィボナッチ数列)

// 再帰的メソッドを使用して、フィボナッチ数列のn番目の値を計算するメソッドfibonacciを作成してください
// フィボナッチ数列: fibonacci(0) = 0, fibonacci(1) = 1, fibonacci(n) = fibonacci(n-1) + fibonacci(n-2)
public class Main {
    // fibonacciメソッドをここに宣言

    public static void main(String[] args) {
        System.out.println("fibonacci(5) = " + fibonacci(5));
        System.out.println("fibonacci(7) = " + fibonacci(7));
        System.out.println("fibonacci(10) = " + fibonacci(10));
    }
}

問題12:複合的なメソッド使用

// 以下のメソッドを作成し、組み合わせて使用してください
// 1. 整数配列を受け取り、すべての要素を表示するprintArrayメソッド
// 2. 整数配列を受け取り、要素を逆順にした新しい配列を返すreverseArrayメソッド
// 3. 2つの整数配列を受け取り、それらを結合した新しい配列を返すconcatArraysメソッド
public class Main {
    // 3つのメソッドをここに宣言

    public static void main(String[] args) {
        int[] arr1 = {1, 2, 3};
        int[] arr2 = {4, 5, 6};

        System.out.print("arr1: ");
        printArray(arr1);

        System.out.print("arr2: ");
        printArray(arr2);

        int[] reversed = reverseArray(arr1);
        System.out.print("逆順: ");
        printArray(reversed);

        int[] combined = concatArrays(arr1, arr2);
        System.out.print("結合: ");
        printArray(combined);
    }
}