Java 逆引き集 | メソッド定義と引数(可変長引数) - 再利用可能ロジック

Java Java
スポンサーリンク

メソッドって何者か(再利用可能ロジックの「部品」)

メソッドは「処理のまとまりに名前を付けて、何度でも呼び出せるようにしたもの」です。 同じような処理をあちこちにコピペする代わりに、「メソッドとして1か所にまとめておく」と、コードが短く・読みやすく・修正しやすくなります。

例えば「2つの整数を足して結果を返す」メソッドはこう書けます。

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

add という名前の「足し算部品」を作っておいて、必要なところから何度でも呼び出せる、というイメージです。

public class MethodExample {
    public static void main(String[] args) {
        int x = add(3, 5);   // 3 + 5
        int y = add(10, 20); // 10 + 20

        System.out.println(x); // 8
        System.out.println(y); // 30
    }

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

「メソッド定義」と「メソッド呼び出し」がセットで理解できると、再利用可能ロジックの感覚が一気に掴めます。

メソッド定義の基本構造を分解する

戻り値・名前・引数・本体

メソッド定義は、ざっくり次の4つの要素でできています。

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

上から順に見ていくと、

  • public static … ここではアクセス修飾子などの「おまけ情報」(初心者のうちは深追いしなくてOK)
  • int … 戻り値の型。「このメソッドは int を返します」という宣言
  • add … メソッド名。「この処理の呼び出し口の名前」
  • (int a, int b) … 引数リスト。「呼び出し側から受け取る値の種類と名前」
  • { ... } … メソッド本体。「実際に何をするか」を書く場所

特に重要なのが「戻り値」と「引数」です。 戻り値は「処理の結果を呼び出し元に返すための出口」、引数は「処理に必要な材料を呼び出し元から受け取る入口」です。

戻り値がないメソッド(void)

「結果を返さず、ただ処理をするだけ」のメソッドもよく使います。 そのときは戻り値の型に void を書きます。

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

呼び出し側は、戻り値を受け取らずにただ呼び出します。

public class VoidExample {
    public static void main(String[] args) {
        printHello("MONO");
        printHello("Hanako");
    }

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

「何かを表示する」「ログを出す」「状態を更新する」など、結果を返さなくても意味がある処理は、void メソッドとして切り出すことが多いです。

引数の考え方と「可変長引数」の前提

引数は「メソッドに渡す材料」

引数は「メソッドが仕事をするために必要な材料」です。 呼び出し側は、その材料を渡してメソッドに仕事を依頼します。

public static int calcTax(int price, double rate) {
    return (int)(price * rate);
}
Java

ここでは pricerate が引数で、「税額を計算するための元の金額」と「税率」を表しています。

呼び出し側はこう使います。

int tax = calcTax(1000, 0.1); // price=1000, rate=0.1
System.out.println("税額 = " + tax); // 100
Java

「メソッドの外側で決まる値を、内側に渡すための窓口」が引数だとイメージするとわかりやすいです。

引数の数が決まっている場合

通常の引数は「何個受け取るか」が定義で決まっています。

public static int add3(int a, int b, int c) {
    return a + b + c;
}
Java

このメソッドは必ず3つの int を受け取ります。 呼び出し側も、3つ渡さないとコンパイルエラーになります。

int sum = add3(1, 2, 3); // OK
// int bad = add3(1, 2); // コンパイルエラー(引数が足りない)
Java

「引数の数が固定されている」パターンではこれで十分ですが、「いくつ渡すかは呼び出し側によって変わる」場面では少し窮屈になります。 そこで登場するのが「可変長引数」です。

可変長引数(varargs)の基本とイメージ

可変長引数とは何か

可変長引数は「0個以上の同じ型の引数を、まとめて受け取るための仕組み」です。 書き方は「型名 + ... + 引数名」です。

public static int sum(int... values) {
    int result = 0;
    for (int v : values) {
        result += v;
    }
    return result;
}
Java

このメソッドは「int を何個渡してもOK」という意味になります。 呼び出し側は、好きな数だけ渡せます。

int s1 = sum();              // 0個
int s2 = sum(10);            // 1個
int s3 = sum(10, 20, 30);    // 3個

System.out.println(s1); // 0
System.out.println(s2); // 10
System.out.println(s3); // 60
Java

イメージとしては「渡された値を配列として受け取る」感じです。 実際、メソッドの中では valuesint[] として扱えます。

メソッド内では「配列」として扱う

可変長引数は、メソッドの中では普通の配列と同じように扱えます。

public static void printAll(String... messages) {
    System.out.println("件数: " + messages.length);
    for (String msg : messages) {
        System.out.println("メッセージ: " + msg);
    }
}
Java

呼び出し側はこう使えます。

printAll("こんにちは");
printAll("A", "B", "C");
Java

messages.length で「何個渡されたか」がわかり、拡張forで1件ずつ処理できます。 「引数の数が呼び出し側によって変わるけれど、全部まとめて処理したい」という場面で非常に便利です。

可変長引数の注意点と設計のコツ

可変長引数は最後の1つだけに使う

可変長引数は「引数リストの最後の1つ」にしか書けません。

public static void log(String level, String... messages) {
    System.out.println("レベル: " + level);
    for (String msg : messages) {
        System.out.println("ログ: " + msg);
    }
}
Java

これはOKですが、次のような定義はコンパイルエラーになります。

// NG: 可変長引数の後に普通の引数は書けない
// public static void bad(String... messages, String suffix) { ... }
Java

理由はシンプルで、「どこまでが可変長引数で、どこからが次の引数なのか」が曖昧になってしまうからです。 「固定の引数 → 可変長引数」という順番だけが許される、と覚えておくとよいです。

配列との違いと使い分け

可変長引数は、呼び出し側から見ると「配列を渡す」書き方と似ています。

public static int sumArray(int[] values) {
    int result = 0;
    for (int v : values) {
        result += v;
    }
    return result;
}
Java

呼び出し側はこう書きます。

int[] arr = {10, 20, 30};
int s = sumArray(arr);
Java

可変長引数版はこうです。

int s = sum(10, 20, 30);
Java

どちらもメソッド内では配列として扱われますが、「呼び出し側の書き心地」が違います。

可変長引数は「その場で値を列挙したいとき」に向いていて、 配列引数は「すでに配列として持っているデータを渡したいとき」に向いています。

設計のときは、「呼び出し側がどういう形でデータを持っているか」をイメージして、可変長引数にするか配列にするかを決めると自然なAPIになります。

可変長引数を乱用しない

可変長引数は便利ですが、何でもかんでも ... にすると、メソッドの意図がぼやけます。

例えば「必ず3つの値が必要な処理」なのに可変長引数にしてしまうと、「2つしか渡さない」「10個渡す」といった誤用がコンパイル時に検出できなくなります。

「本当に引数の数が可変である必要があるか?」 「仕様として、何個渡される可能性があるか?」

このあたりを意識して、「可変であること自体が仕様の一部」になっている場面だけで使うと、メソッド設計がきれいになります。

再利用可能ロジックとしてのメソッド設計

「名前」と「引数」で意図を表現する

メソッドは「名前」と「引数」で、何をするロジックなのかを表現します。

public static int calcTotalWithTax(int price, double taxRate) { ... }
public static boolean isAdult(int age) { ... }
public static void sendMail(String to, String subject, String body) { ... }
Java

これらは、名前と引数を見るだけで「何をするメソッドか」「何が必要な材料か」が伝わります。

逆に、次のようなメソッドは意図が伝わりにくいです。

public static int func1(int a, int b) { ... }
public static void doProcess(String s1, String s2, String s3) { ... }
Java

再利用可能ロジックとしてメソッドを設計するときは、「未来の自分や他の人が、定義を開かなくても意味を想像できる名前・引数にする」ことを強く意識すると、コードの質が一気に上がります。

メソッドに「1つの責務」だけを持たせる

メソッドは「1つのはっきりした仕事」だけを担当させるのが基本です。

例えば、

public static int calcDiscountPrice(int price, double rate) { ... }
Java

は「割引後の価格を計算する」という1つの責務です。

もしこのメソッドの中で「DBから顧客情報を取る」「ログを出す」「メールを送る」など、いろいろ詰め込み始めると、再利用しづらくなり、テストもしづらくなります。

「このメソッドは何をするのか?」を1文で説明できるかどうかを、自分へのチェックポイントにすると、再利用可能ロジックとしてのメソッド設計が安定してきます。

まとめと小さな練習

メソッドは「処理のまとまりに名前を付けて、引数で材料を受け取り、戻り値で結果を返す」再利用可能な部品です。 可変長引数は「同じ型の引数を0個以上まとめて受け取る」ための仕組みで、メソッド内では配列として扱えます。

最後に、練習としてこんなメソッドを自分で書いてみるといいです。

  • 任意個の int を受け取って「最大値」を返すメソッド(可変長引数を使う)
  • メール送信のダミーメソッド sendMail(String to, String... cc) を作り、宛先とCCを表示するだけの処理を書く

実際に手を動かして、「定義」「呼び出し」「引数の渡し方」「可変長引数の挙動」を体で覚えると、メソッド設計がぐっと楽になります。

タイトルとURLをコピーしました