複数の引数を取るメソッド

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

複数の引数を取るメソッド とは

幅と高さの 2 つを受け取って長方形の面積を返すメソッドを書きながら、複数引数の書き方と意図の伝え方を身につけよう。

複数の入力を扱えるようになろう

ここまでのレッスンでは、引数が 0 個か 1 個のメソッドを書いてきました。けれど現実のプログラムは、ほとんどが「複数の情報を組み合わせて答えを出す」処理でできています。長方形の面積なら 高さ、ログイン処理なら ユーザー名パスワード、商品の合計金額なら 単価個数 というように、Java で実用的なメソッドを書こうとすると、すぐに引数が複数必要になります。

プログラミングの世界では、メソッドのことを「小さな関数の箱」とよく説明します。箱に入れる材料 (引数) が複数あって、加工して 1 つの結果 (戻り値) として返す ─ これが Java のメソッドの基本イメージです。引数の数が増えるほど、箱の入り口の幅が広がっていくと思ってください。

このレッスンでは、Solution.rectangleArea(int width, int height) という形のメソッドを書いて、長方形の面積を返してもらいます。一見たった 1 行 return width * height; で終わる課題ですが、その裏には「引数を , で区切る文法」「順序の意味」「名前の付け方」「数が増えすぎたときの設計判断」と、Java のメソッド設計の急所が詰まっています。

引数を , で並べる文法

まずは複数の引数を受け取るメソッドの形を確認します。引数は () の中に「型 名前」のペアを書き、それぞれを 半角の , で区切るのがルールです。

Java

public class Solution { public static int rectangleArea(int width, int height) { return width * height; } }

読み下すと「rectangleArea というメソッドは、intwidthintheight を受け取って、int の値を返す」となります。引数の 型は 1 つずつ書く のがポイントです。PythonTypeScript のような言語に慣れていると、int width, height のように型を 1 個だけ書きたくなりますが、Java ではこれは構文エラーになります。int width, int height のように、毎回きちんと型を書く必要があります。

Java の引数リストの正しい形は「型 名前, 型 名前, 型 名前, ...」の繰り返しです。int を省略すると , 以降の変数だけ別の型として解釈されてしまうため、コンパイラから <identifier> expected のようなエラーが返ります。最初は面倒に感じますが、Java のように型の安全さを売りにしている言語では、これが「ここに何が入るのか」を明確にするための大切な決まりです。

呼び出す側の書き方も合わせて見ておきましょう。rectangleArea(3, 4) のように、引数の値を , で区切って同じ順番で並べるだけです。int area = rectangleArea(3, 4); と書けば、area には 12 が入ります。

Java

int area1 = Solution.rectangleArea(3, 4); // 12 int area2 = Solution.rectangleArea(5, 5); // 25 int area3 = Solution.rectangleArea(0, 10); // 0

0 を渡したときに 0 が返るのは、0 * 100 になるという算数のおかげです。長方形の 高さ0 なら、図形としての面積も当然 0 ─ 数式が現実の意味とつながっていることを感じてもらえると思います。

引数の順序には意味がある

複数の引数で一番ハマりやすいのが、順序の取り違え です。rectangleArea(3, 4)rectangleArea(4, 3) は同じ 12 を返すのでバグに気づきにくいのですが、もし Solution.divide(int a, int b) のような割り算メソッドを書くと話はまるで違います。

Java

public static int divide(int a, int b) { return a / b; }

divide(10, 2)5 ですが、divide(2, 10)0 (整数同士の割り算なので 2 / 100) になります。引数の順序を入れ替えるだけで結果が全然違うのが分かるはずです。

メソッドを設計するときは「引数の順序」を メソッド名と一緒に思い出せる 並びにするのがコツです。たとえば subtract(int from, int amount) のように「from から amount を引く」と読める順番にしておくと、呼び出す側もミスしにくくなります。Java 標準ライブラリの Math.max(a, b) String.substring(beginIndex, endIndex) などは、こうした「読み下せる順番」の良い例です。

下の図は、rectangleArea(3, 4)34 がメソッドの中の widthheight にどう流れ込むかを表したものです。「位置」が「変数」に変わるイメージをつかんでください。

diagram (will load when visible)

位置で結びつくのが Java の引数渡し (positional arguments) の基本です。Python のように rectangleArea(height=4, width=3) といった名前付き引数は Java には用意されていないので、順番でしか結びつかない のだとしっかり覚えておきましょう。

引数名は「意図」を伝える看板

コンパイラから見ると引数名は単なるラベルで、int a, int b でも int width, int height でも動きは変わりません。けれど、読む人 (1 か月後の自分を含めて) からすると、名前は そのメソッドが何をしているかを説明する看板 です。

例として、面積メソッドを 2 つの書き方で並べてみます。

Java

// Before: 引数名が抽象的すぎて意図がわからない public static int area(int a, int b) { return a * b; } // After: 引数名が意図を語っている public static int rectangleArea(int width, int height) { return width * height; }

動作はまったく同じですが、After の方は「これは widthheight を掛けて長方形の面積を出すメソッドだ」と一目で分かります。Beforea b だと、呼び出し側で area(3, 4) と書いても「これってどっちが幅?」と毎回ドキュメントを見に行かないといけません。

名前付けに迷ったら、英語の物理量や日常語をそのまま使うと無難です。width height length radius price quantity userId name などは、ほとんどの開発現場で同じ意味で通じます。逆に避けたいのは tmp data x1 x2 のような中身を語らない名前です。Java の世界には「コードは書く時間より読まれる時間の方が圧倒的に長い」という格言があり、命名はそのコストを下げる最大の武器になります。

引数が増えすぎたときの考え方

引数は何個まで書いていいのでしょうか?文法的には Java では最大 255 個まで宣言できますが、現実には 34 個を超えたら設計を見直したほうがいい とよく言われます。理由は単純で、人間が同時に覚えていられる引数の順序は 3 〜 4 個が限界だからです。

例えば、商品の合計金額を出すメソッドが次のように肥大化したとします。

Java

// 引数が多すぎて何の順番だったか分からなくなる例 public static int totalPrice(int unitPrice, int quantity, int taxPercent, int discountPercent, int shippingFee, boolean isMember) { // ... }

この状態だと totalPrice(1000, 2, 10, 5, 500, true) のような呼び出しになって、各数字が何を意味するのか呼び出し側のコードを見ただけでは分かりません。こうなったら、関連する引数をまとめて新しい型 (クラスや record) に切り出すのが定石です。

Java

record Cart(int unitPrice, int quantity, int discountPercent) {} record ShippingInfo(int feeYen, boolean isMember) {} public static int totalPrice(Cart cart, ShippingInfo shipping, int taxPercent) { // ... }

引数 3 つに収まると、呼び出し側も読み手も一気に楽になります。Java 16 以降で導入された record は、こうした「引数の束」を作るのにとても便利です。今すぐ書けるようになる必要はありませんが、「引数は 3 〜 4 個まで」「増えたら束ねる」という発想だけ覚えておきましょう。

よくある間違い

複数引数のメソッドで初心者がやらかしがちな落とし穴を 3 つ紹介します。

  • 引数の順序を逆に渡すrectangleArea(width, height) のつもりが rectangleArea(height, width) で呼んでしまうケース。長方形の面積では結果が同じなので気づきにくいですが、drawRect(x, y, width, height) のような関数では位置がズレて図形が変な場所に描かれます。呼び出すときは「メソッド宣言と同じ順番で書けているか」を必ず確認してください
  • 型を 1 個だけ書くint width, height のように書いて、int width, int height と書き忘れるパターン。Java のコンパイラから ';' expected <identifier> expected といった分かりにくいエラーが出ます。引数 1 個ごとに型を書く、を呪文として唱えてください
  • 引数 0 個のメソッドと混同する — 1 つ前のレッスンで書いた helloWorld() のような引数なしメソッドの感覚で、rectangleArea() と引数を渡さずに呼び出してしまうケース。コンパイラから method rectangleArea in class Solution cannot be applied to given types と長いエラーが出ます。引数を必要とするメソッドは、呼び出すときも同じ数だけ値を渡す必要があります

もうひとつ忘れがちなのが、引数の型不一致 です。rectangleArea(3.5, 4) のように double を渡すと、引数が int で宣言されているメソッドには受け取ってもらえません。型が違うと incompatible types エラーになります。int を期待しているところには int を渡す、double がほしければメソッド側を double width で宣言する、というように、型を意識する習慣をつけましょう。

エラーメッセージは長く感じても、頭の方の method ... cannot be applied to given types incompatible types あたりだけを拾えば原因がわかります。Java のエラーは情報量が多くてうるさく感じる時期もありますが、慣れると「コンパイラがあらかじめバグを止めてくれてありがたい」と感じるようになります。

やってみよう

それでは右側のエディタで、Solution.rectangleArea(int width, int height) メソッドを完成させましょう。手順は次の通りです。

  1. メソッドのカッコの中が int width, int height の 2 つの引数になっていることを確認する
  2. 中身に return width * height; と書く
  3. 「実行」ボタンを押して、すべてのテストが緑になることを確認する

動いたら、いくつか実験して感覚を広げてみてください。例えば return height * width; と順序を入れ替えても結果が同じになることを確かめてみたり、int area = width * height; といったん変数に入れてから return area; する書き方に変えてみたり、Solution.rectangleArea(0, 100) のように 0 を渡すと 0 が返ることを確認してみたりです。

余裕があれば、triangleArea(int base, int height) のような三角形の面積メソッドを自分で別に作ってみると、複数引数の書き方が一気に手に馴染みます。三角形なら return base * height / 2; ですね。Javaint 同士の割り算は小数を切り捨てる挙動なので、base = 5, height = 3 だと 5 * 3 / 27 (7.5 ではなく) になります。「型と挙動のセット」で覚えると、後のレッスンで double を扱うときに違いがすっきり頭に入ります。

複数引数を扱えるようになると、Java で書けるプログラムの幅は一気に広がります。次のレッスン以降では、ここで身につけた「引数を , で並べる」「順序を守る」「名前で意図を伝える」という感覚を土台に、もう少し複雑なメソッドを組み立てていきます。

よくある質問

Q. Java と他言語の文法はどう違いますか?

A. Java は静的型付けで、変数宣言時に型を明示します(int x = 0;)。中括弧でブロックを表し、文末にセミコロンが必要です。Python の動的型付けや JavaScript の柔軟さに慣れていると最初は窮屈ですが、コンパイル時にバグが発見できる安全性がメリットです。

Q. コードが動かないときに最初に見るべき場所は?

A. コンパイルエラーは行番号とエラー種別(cannot find symbol、incompatible types など)が表示されます。実行時例外はスタックトレースの最初の at ... が原因行です。IDE(IntelliJ / VS Code)の警告も丁寧に潰すと、半分のバグは未然に防げます。

Q. Java の習得後に学ぶべき技術は何ですか?

A. 基本構文を抑えたら java-intermediate(コレクション / ジェネリクス / Stream / 例外)に進み、Spring Boot や Web 開発に展開するのが王道です。クラウド時代は Kotlin / Scala への展開も視野に入りますが、まずは Java 標準を固めるのが効率的です。

次のレッスン

次は メソッドのオーバーロード で、幅と高さの 2 つを受け取って長方形の面積を返すメソッドを書きながら、複数引数の書き方と意図の伝え方を身につけよう を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. 複数引数 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. 複数引数 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. クラス名は Solution、メソッド名は rectangleArea、引数は int widthint height の 2 つにすること
  2. メソッドの戻り値の型は int で、width * height の計算結果を返すこと
  3. 引数 width または height0 の場合、戻り値は 0 になること

入出力例

test-cases.txt

rectangleArea(3, 4)12 rectangleArea(5, 5)25 rectangleArea(0, 10)0 rectangleArea(7, 1)7 rectangleArea(12, 8)96

ヒント

main.java
main.java
学習モード

メモ

複数の引数を取るメソッド

⌘S で保存