メソッドを定義する

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

このレッスンで分かること

  • メソッドは 修飾子 戻り値型 名前(引数) { ... return 値; } の形で定義します
  • chotdekiru の coding 問題では public static を付けてクラスから直接呼べる形で書きます
  • 最小例は public static String getGreeting() { return "Hello from method!"; }

メソッドを定義する とは

Java の処理をまとめて名前を付ける仕組み、メソッドの定義と呼び出しを学ぼう。本レッスンでは、メソッドを定義する の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

メソッドを定義する

ここまでで変数、計算、条件分岐、繰り返しと、Java プログラムを組み立てる基本道具が一通り揃いました。今回からは、処理のかたまりに名前を付けて再利用する仕組み、メソッド (method) に踏み込みます。これまでも helloWorld()main() のような形でメソッドを書いてはいましたが、今回は「自分で新しいメソッドを定義する」ことそのものに焦点を当てて見ていきます。

関数 (function) という呼び方を他の言語で聞いたことがある人もいるかもしれません。Java ではクラスの中で定義する処理のかたまりを基本的に メソッド と呼びます。意味としてはほぼ同じものだと思って大丈夫です。

メソッドとは何か

メソッドを一言で言うと「処理のかたまりに名前を付けて再利用できるようにしたもの」です。たとえば「あいさつ文を返す」「税込価格を計算する」「ユーザー名から URL を組み立てる」など、ちょっとした仕事を 1 つの単位として切り出すイメージです。

メソッドを使うメリットは大きく次のとおりです。

  • 再利用ができる — 一度書いた処理を、別の場所から getGreeting() のように呼び出すだけで再利用できる
  • 名前で意図を表せるtax(120)getGreeting() のように、コードを読む人に「ここは何をしている処理か」を名前で伝えられる
  • テストしやすくなる — メソッド単位で assertEquals のような形で動作確認できるため、バグを早く見つけられる
  • 修正の影響範囲を狭くできる — 同じ処理を何カ所にも書いていたら全部直す必要があるが、メソッドにまとめてあれば 1 か所直すだけで済む

プログラミングの世界では同じ処理を何度も書くことを DRY 原則 (Don't Repeat Yourself) の違反として嫌います。メソッドはこの DRY を守るためのいちばん身近な道具です。

メソッド定義の構文

Java のメソッド定義は、次のような並びになっています。

Java

public static String getGreeting() { return "Hello from method!"; }

暗号のように見える 1 行目を、左から順に分解しましょう。

要素役割
publicアクセス修飾子。どこからでも呼べる
staticクラスを new しなくても呼べる
String戻り値の型
getGreetingメソッド名 (camelCase)
()引数リスト (空なら引数なし)
{ ... }本体

本体の中で return "Hello from method!"; と書くと、呼び出した側にこの文字列が返されます。戻り値の型が String なので、return の後ろの値も String でなければなりません。整数 123 を返そうとするとコンパイルエラーになります。

用語をまとめると、メソッドは「修飾子 + 戻り値型 + 名前 + 引数リスト + 本体」の 5 つで構成されます。最初は呪文に見えますが、書き慣れるとスラスラ読めるようになります。

呼び出し側のコードを書く

定義しただけのメソッドは、誰かに 呼び出して もらわないと働きません。Solution.getGreeting() のような形で呼び出すと、メソッドの本体が実行され、戻り値がその場所に「埋め込まれる」ように振る舞います。

Java

public class Solution { public static String getGreeting() { return "Hello from method!"; } public static void main(String[] args) { String message = getGreeting(); System.out.println(message); System.out.println(getGreeting()); } }

この例では main メソッドの中で getGreeting() を 2 回呼び出しています。1 回目は戻り値を一度 String message に受け取ってから出力、2 回目は System.out.println の引数に直接渡しています。どちらも結果は同じで、Hello from method! が 2 行出力されます。

chotdekiru の Java Playground では、テストは Solution.getGreeting() の戻り値を直接見て採点します。System.out.println で表示するだけでは正解扱いになりません。必ず return で値を返してください。

呼び出しの流れを図にすると次のようになります。メソッドの定義は冷蔵庫にしまってある料理のレシピ、呼び出しはそのレシピを使って料理を作るタイミング、というイメージです。

diagram (will load when visible)

図の流れを順序リストで書き直すと、次の通りです。

  1. 呼び出し元 (main) が getGreeting() を呼ぶ
  2. メソッド側で本体を実行する
  3. return で値を戻す
  4. 呼び出し元で戻り値を message に受け取る
  5. その後 message を使って表示などを行う

呼び出された瞬間に処理の主役が getGreeting() の中に移り、return のタイミングで主役が呼び出し元に戻ってくる、この往復のリズムをイメージできるとメソッドの理解がぐっと進みます。

void メソッドとの対比

メソッドは必ずしも値を返す必要はありません。たとえば「画面に何かを表示するだけ」のメソッドは、戻り値を持たないので戻り値型に void を指定します。

Java

public class Logger { public static void printGreeting() { System.out.println("Hello from method!"); } }

void メソッドは return 文を書く必要がありません (途中で抜けたいときだけ return; と書きます)。値を呼び出し元に渡したいなら String などの戻り値型、ただ処理を実行したいだけなら void、と使い分けるのが基本です。

自動テストで結果を確認するときは、void メソッドより Stringint を返すメソッドのほうが圧倒的に扱いやすいです。chotdekiru の coding 問題はこのため、ほぼすべて戻り値ありのメソッドで設計されています。

よくある間違い

メソッドを書き始めたばかりの頃に、誰もがよくつまずく落とし穴を 3 つ紹介します。

  • 戻り値型を void にしているのに値を return してしまうvoid は「戻り値なし」の意味なので、return "Hello"; のように値を返すとコンパイルエラーになります。値を返したいなら戻り値型を Stringint に変更しましょう
  • return; だけ書いて値を返し忘れる — 逆に戻り値型を String にしているのに return; とだけ書くと「missing return value」エラーが出ます。戻り値の型に合った値を必ず指定してください
  • static の付け忘れ — chotdekiru の coding 問題は Solution.getGreeting() のように、クラス名から直接呼び出します。static を忘れるとインスタンス化が必要なメソッドになってしまい、テスト側から呼べずに fail します

もうひとつ地味に多いのが、メソッド名の大文字小文字違いです。getGreetinggetgreetingJava では完全に別物として扱われます。function_name で指定された名前と完全一致するように書いてください。

エラーメッセージは敵ではなく味方です。cannot find symbol と出たらメソッド名のタイポ、missing return statement と出たら return 漏れ、と原因をある程度予想できるようになると修正のスピードが上がります。

この章のポイント

ここまでの要点 メソッドは 修飾子 + 戻り値型 + 名前(引数) + 本体public static を付けてクラス名から直接呼べる形にする。void は値を返さない、それ以外は必ず return で値を返す。

やってみよう

それでは課題に挑戦しましょう。手順は次のとおりです。

  1. 右側のエディタを開く
  2. Solution クラスの中に public static String getGreeting() メソッドを定義する
  3. メソッドの本体で return "Hello from method!"; を書く
  4. 「実行」ボタンを押して、テストが緑になることを確認する

慣れてきたら、getGreeting() の中身を別の文字列に変えてみたり、getGreeting() を呼び出す main を書き足して System.out.println で実際に表示してみたり、自由に遊んでみてください。テストは特定の文字列を期待しているので fail しますが、return の戻り値が呼び出し元に伝わる感覚を体で覚える絶好の練習になります。

メソッドは Java プログラムを「組み立てる」ための一番大切な部品です。ここから先は引数あり、複数の戻り値パターン、クラス間のメソッド呼び出し、と少しずつ世界が広がっていきます。まずはこの一番シンプルなメソッドで、定義と呼び出しのリズムを体に染み込ませましょう。

よくある質問

Q. メソッドの引数は何個まで書けますか?

A. 言語的には何個でも書けますが、4-5 個を超えると呼び出し側が読みにくくなります。多くなったら関連する引数をクラスや record(Java)/ dataclass(Python)/ オブジェクト(JS)にまとめ、1 つの引数として渡すのがリファクタの定石です。

Q. 戻り値の型 void と他の型はどう使い分けますか?

A. 副作用(DB 更新、画面描画)だけならvoid、計算結果や状態を返すなら具体的な型です。テストしやすさは戻り値ありの方が圧倒的に高いため、純粋関数として書けるところはなるべく値を返す設計にすると良いです。

Q. static メソッドはいつ使いますか?

A. インスタンスの状態に依存しないユーティリティ関数(Math.max など)に向きます。逆にフィールドを使うなら static にせず、インスタンスメソッドにしてください。テスト時に static は差し替えにくいため、依存注入したいなら避けるのが無難です。

次のレッスン

次は 引数を受け取るメソッド で、Java の処理をまとめて名前を付ける仕組み、メソッドの定義と呼び出しを学ぼう を学びます。

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

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

理解度チェック (30 秒)

Q. メソッド基本 とは何か、1 文で説明してください。

この章のポイント

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

関連レッスン

要件

  1. クラス名は Solution、メソッド名は getGreeting にすること
  2. メソッドの戻り値の型は String で、引数はなし、public static を付けること
  3. 文字列 "Hello from method!"return で返すこと (大文字小文字、半角スペース、末尾の ! まで正確に)

入出力例

test-cases.txt

getGreeting()"Hello from method!"

ヒント

main.java
main.java
学習モード

メモ

メソッドを定義する

⌘S で保存