この記事の要点
• メソッドは処理をまとめて名前を付けたもの
• 宣言は 戻り値型 メソッド名(引数) { ... }
• return で値を返す。戻り値がない場合は void
このシリーズについて
「Java入門」は1本1テーマで進む全15回のシリーズです。本記事はその第11回として、メソッドの定義と呼び出しを扱います。
前提条件: Java 21 がインストール済み。変数、配列、for文の基本を理解していること。
メソッドとは
メソッド(Method) は処理をまとめて名前を付けたものです。他の言語では「関数」と呼ばれることもあります。
| メソッドを使う理由 | 説明 |
|---|---|
| 再利用 | 同じ処理を何度も書かずに済む |
| 可読性 | 処理に名前が付くので、コードが読みやすくなる |
| 保守性 | 修正が1箇所で済む |
例えば「2つの数の合計を計算」という処理を何度も書くと冗長です。
int a = 5, b = 10;
int sum1 = a + b;
int c = 20, d = 30;
int sum2 = c + d;
メソッドにまとめると簡潔になります。
int sum1 = add(5, 10);
int sum2 = add(20, 30);
メソッドの宣言
アクセス修飾子 戻り値型 メソッド名(引数型 引数名, ...) {
// 処理
return 戻り値;
}
| 要素 | 説明 | 例 |
|---|---|---|
| アクセス修飾子 | メソッドの公開範囲 | public, private など |
| 戻り値型 | 返す値の型 | int, String, void(戻り値なし) |
| メソッド名 | 処理を表す名前 | add, calculateSum など |
| 引数 | 受け取る値 | int a, int b |
基本例: 戻り値があるメソッド
// Java 21
public class MethodExample {
public static void main(String[] args) {
int result = add(5, 10);
System.out.println("5 + 10 = " + result); // → 5 + 10 = 15
result = add(20, 30);
System.out.println("20 + 30 = " + result); // → 20 + 30 = 50
}
// メソッド定義
public static int add(int a, int b) {
return a + b;
}
}
| 部分 | 説明 |
|---|---|
public static | クラスメソッド(後述)。現時点では「おまじない」として付ける |
int | 戻り値の型(整数を返す) |
add | メソッド名 |
int a, int b | 引数(2つの整数を受け取る) |
return a + b; | 計算結果を返す |
ポイント: static は「クラスメソッド」を意味します。main から直接呼び出すメソッドには static が必要です。詳細は次回のクラスで扱います。
void: 戻り値がないメソッド
戻り値が不要な場合は void を使います。
// Java 21
public class VoidExample {
public static void main(String[] args) {
greet("Alice");
greet("Bob");
}
public static void greet(String name) {
System.out.println("こんにちは、" + name + "さん!");
// return は書かない(または return; だけ)
}
}
出力:
こんにちは、Aliceさん!
こんにちは、Bobさん!
| 戻り値型 | 用途 |
|---|---|
int, String など | 計算結果や値を返す |
void | 画面表示、ファイル書き込みなど、値を返さない処理 |
補足: void メソッドでも途中で抜けたい場合は return;(値なし)を使えます。
引数の渡し方
Javaは値渡しです。メソッド内で引数を変更しても、呼び出し元の変数には影響しません。
プリミティブ型の場合
// Java 21
public class PassByValue {
public static void main(String[] args) {
int x = 10;
increment(x);
System.out.println(x); // → 10(変わらない)
}
public static void increment(int n) {
n = n + 1; // コピーを変更しているだけ
}
}
配列・オブジェクトの場合
参照型(配列、オブジェクト)の場合、参照が値渡しされます。中身は変更できます。
// Java 21
public class ArrayParameter {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
modifyArray(arr);
System.out.println(arr[0]); // → 100(変更される)
}
public static void modifyArray(int[] array) {
array[0] = 100; // 参照先の中身を変更
}
}
| 型 | 引数の扱い |
|---|---|
| プリミティブ型 | コピーが渡される。元の変数には影響しない |
| 参照型(配列、オブジェクト) | 参照が渡される。中身は変更できる |
注意: 配列やオブジェクトをメソッドに渡すと、中身を変更できてしまいます。意図しない副作用を避けるため、メソッドの役割を明確にしましょう。
オーバーロード(多重定義)
同じ名前で引数の型や個数が異なるメソッドを複数定義できます。
// Java 21
public class OverloadExample {
public static void main(String[] args) {
System.out.println(add(5, 10)); // → 15
System.out.println(add(5.5, 10.5)); // → 16.0
System.out.println(add(5, 10, 15)); // → 30
}
// int 2つ
public static int add(int a, int b) {
return a + b;
}
// double 2つ
public static double add(double a, double b) {
return a + b;
}
// int 3つ
public static int add(int a, int b, int c) {
return a + b + c;
}
}
| 区別される要素 | 区別されない要素 |
|---|---|
| 引数の型 | 戻り値の型 |
| 引数の個数 | 引数の名前 |
| 引数の順序 |
ポイント: 戻り値の型が違うだけではオーバーロードとして認識されません。必ず引数の型・個数・順序のいずれかが異なる必要があります。
アクセス修飾子
メソッドの公開範囲を制御します。
| 修飾子 | 同じクラス | 同じパッケージ | サブクラス | どこからでも |
|---|---|---|---|---|
public | ◯ | ◯ | ◯ | ◯ |
protected | ◯ | ◯ | ◯ | × |
| (なし = default) | ◯ | ◯ | × | × |
private | ◯ | × | × | × |
現時点では以下の使い分けだけ覚えてください。
| 修飾子 | 用途 |
|---|---|
public | 外部から呼び出したいメソッド |
private | クラス内部でのみ使うメソッド |
// Java 21
public class AccessExample {
public static void main(String[] args) {
printMessage(); // public なので呼び出せる
// privateMethod(); // エラー: private なので main から呼べない
}
public static void printMessage() {
System.out.println("Public method");
privateMethod(); // 同じクラス内なので呼び出せる
}
private static void privateMethod() {
System.out.println("Private method");
}
}
補足: protected と default(修飾子なし)の違いは継承を扱う際に重要です。現時点では public と private を使い分けられれば十分です。
実践例: 配列の最大値を返すメソッド
// Java 21
public class ArrayMax {
public static void main(String[] args) {
int[] scores = {85, 90, 78, 92, 88};
int max = findMax(scores);
System.out.println("最大値: " + max); // → 最大値: 92
}
public static int findMax(int[] array) {
int max = array[0];
for (int i = 1; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
}
}
return max;
}
}
ポイント: 「配列の最大値を探す」という処理をメソッドにすることで、他の場所でも再利用できます。
よくあるミス
1. return を書き忘れる
public static int add(int a, int b) {
int sum = a + b;
// return を書き忘れ → コンパイルエラー
}
正しくは:
public static int add(int a, int b) {
int sum = a + b;
return sum;
}
2. void メソッドで値を返そうとする
public static void greet(String name) {
return "Hello"; // エラー: void は値を返せない
}
正しくは:
public static String greet(String name) {
return "Hello, " + name;
}
3. 引数の型が一致しない
int result = add("5", "10"); // エラー: add は int を受け取る
正しくは:
int result = add(5, 10);
まとめ
| 項目 | 内容 |
|---|---|
| 宣言 | 戻り値型 メソッド名(引数) { return 値; } |
| void | 戻り値がない場合に使う |
| 引数 | プリミティブ型はコピー、参照型は参照が渡される |
| オーバーロード | 引数の型・個数・順序が異なれば同名可 |
| 修飾子 | public(外部公開)、private(内部専用) |
- メソッドは処理を再利用・整理するための基本単位
returnで値を返す(voidなら不要)staticは現時点では「おまじない」として付ける(次回詳細解説)
次のステップ
Java入門 #12 - クラスとオブジェクト でオブジェクト指向の基本となるクラスを学びます。
参考リソース
- Oracle Java Tutorials - Defining Methods
- Oracle Java Tutorials - Passing Information to a Method or a Constructor
- Java SE 21 Language Specification - Method Declarations