メソッドって何者か(再利用可能ロジックの「部品」)
メソッドは「処理のまとまりに名前を付けて、何度でも呼び出せるようにしたもの」です。 同じような処理をあちこちにコピペする代わりに、「メソッドとして1か所にまとめておく」と、コードが短く・読みやすく・修正しやすくなります。
例えば「2つの整数を足して結果を返す」メソッドはこう書けます。
public static int add(int a, int b) {
int result = a + b;
return result;
}
Javaadd という名前の「足し算部品」を作っておいて、必要なところから何度でも呼び出せる、というイメージです。
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ここでは price と rate が引数で、「税額を計算するための元の金額」と「税率」を表しています。
呼び出し側はこう使います。
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イメージとしては「渡された値を配列として受け取る」感じです。 実際、メソッドの中では values は int[] として扱えます。
メソッド内では「配列」として扱う
可変長引数は、メソッドの中では普通の配列と同じように扱えます。
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");
Javamessages.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を表示するだけの処理を書く
実際に手を動かして、「定義」「呼び出し」「引数の渡し方」「可変長引数の挙動」を体で覚えると、メソッド設計がぐっと楽になります。

