こんにちは、かつコーチです。
「同じ処理を何回も書いていて冗長だな」と感じたことはありませんか。
Javaでは、そうした処理をメソッド(一連の処理をまとめて名前を付けたもの)にすることで、コードをスッキリさせられます。
この記事では、メソッドの定義方法と引数の渡し方を、実際に手を動かしながら理解できるように解説します。
メソッドとは?
処理をまとめて名前を付ける仕組み
メソッドとは、複数行の処理を1つのまとまりにして、名前を付けて呼び出せるようにしたものです。
たとえば「税込価格を計算する」処理を何度も書く代わりに、calculateTaxというメソッドを1つ作っておけば、どこからでも同じ処理を呼び出せます。
Javaのメソッドは、クラスの中に定義するのが基本ルールです。
これは、Javaがオブジェクト指向(データと処理をひとまとまりのオブジェクトとして扱う考え方)の言語だからです。
なぜメソッド化が必要なのか
メソッド化には主に3つのメリットがあります。
- 同じコードを何度も書かなくて済む(重複排除)
- 処理に名前が付くので、コードの意図が読みやすくなる
- 修正が必要になったとき、1箇所を直せば全体に反映される
逆に言えば、メソッド化せずに同じ処理をコピペし続けると、バグ修正の際に「直し漏れ」が発生しやすくなります。
私も駆け出しの頃、消費税計算のロジックを3箇所にコピペしていて、税率変更の際に1箇所だけ直し忘れて金額がズレるというミスをしたことがあります。
メソッドの基本の書き方
手順1:メソッドの基本構文
Javaのメソッドは、以下の形で定義します。
public class Calculator {
// 戻り値の型 メソッド名(引数の型 引数名) { 処理 }
public int add(int a, int b) {
int result = a + b;
return result;
}
public static void main(String[] args) {
Calculator calc = new Calculator();
int sum = calc.add(3, 5);
System.out.println(sum); // 8
}
}
構文の要素を整理すると次のとおりです。
public:アクセス修飾子(どこから呼び出せるかを指定)int:戻り値の型(呼び出し元に返す値の型)add:メソッド名(int a, int b):引数(メソッドに渡す値。カッコ内で型と変数名を指定する)return result;:処理結果を呼び出し元に返す文
手順2:引数を使ってメソッドに値を渡す
引数は、メソッドの外から値を渡すための仕組みです。
複数の引数を渡す場合は、カンマで区切って指定します。
public class PriceCalculator {
public int calculateTax(int price, double taxRate) {
return (int) (price * taxRate);
}
public static void main(String[] args) {
PriceCalculator calculator = new PriceCalculator();
int tax = calculator.calculateTax(1000, 0.1);
System.out.println("消費税: " + tax + "円"); // 消費税: 100円
}
}
引数の型と、呼び出し時に渡す値の型が一致していないとコンパイルエラーになります。
手順3:戻り値がない場合はvoidを使う
処理結果を返す必要がない場合は、戻り値の型をvoidにします。
public class Greeter {
public void greet(String name) {
System.out.println(name + "さん、こんにちは。");
}
public static void main(String[] args) {
Greeter greeter = new Greeter();
greeter.greet("田中"); // 田中さん、こんにちは。
}
}
voidのメソッドの中でreturnを使う場合は、値を付けずにreturn;とだけ書きます(処理を途中で終わらせたいときに使います)。
よくあるつまずきポイント・エラー対処
戻り値の型とreturnの不一致
戻り値の型を宣言したのにreturnを書き忘れると、コンパイルエラーになります。
私が実際に遭遇したのは、条件分岐の中でしかreturnを書いていなかったケースです。
❌Before
public int judge(int score) {
if (score >= 60) {
return 1;
}
// elseの場合のreturnがない
}
このコードをコンパイルすると、次のようなエラーが出ます。
error: missing return statement
このエラーは「メソッドが値を返さない可能性がある経路がある」ことを意味します。ifの条件を満たさなかった場合のreturnが抜けているのが原因です。
✅After
public int judge(int score) {
if (score >= 60) {
return 1;
}
return 0; // すべての経路でreturnを用意する
}
すべての実行経路で必ず値を返すように、elseや最後にreturnを書くのが解決策です。
引数の数・型を間違える
呼び出し時に引数の数や型を間違えると、コンパイルエラーになります。
calculator.calculateTax(1000); // 引数が1つ足りない
error: method calculateTax in class PriceCalculator cannot be applied to given types;
required: int,double
found: int
reason: actual and formal argument lists differ in length
エラーメッセージのrequired(必要な引数)とfound(実際に渡した引数)を見比べると、原因を特定しやすくなります。
応用・一歩先の使い方
メソッドは「1つの役割」に絞る
メソッドを設計する際は、1つのメソッドに1つの役割だけを持たせるのが基本方針です。
「税込価格を計算する」メソッドの中で、ついでに「ログ出力」や「データベース保存」まで詰め込んでしまうと、再利用しづらく、テストもしにくくなります。
役割が増えてきたと感じたら、メソッドを分割するサインだと考えましょう。
この考え方は、後述するオーバーロード(同じ名前で引数違いのメソッドを複数定義すること)や、可変長引数の使い分けにもつながっていきます。
まとめ
この記事のポイント
- メソッドは処理をまとめて名前を付ける仕組みで、重複排除と可読性向上につながる
- 基本構文は「戻り値の型 メソッド名(引数の型 引数名) { 処理 }」
- 戻り値がない場合は
voidを使い、すべての実行経路でreturnを書き忘れない - 引数の数・型の不一致はコンパイルエラーになるため、エラーメッセージの
requiredとfoundを確認する
次に読むべき記事
- Javaのメソッドのオーバーロードについては、次の記事で解説します
- 変数のスコープについて詳しく知りたい方は、スコープと変数の生存期間の記事もあわせてご覧ください
タグ: Java, 初心者向け, 基本文法