カテゴリ: Javaのメソッド 更新日: 2025/05/06

Java の可変長引数(引数の数が変わるメソッドの書き方)

109
Java の可変長引数(引数の数が変わるメソッドの書き方)

新人と先輩の会話形式で理解しよう

新人

「Java のメソッドの引数の数を決めずに作ることはできますか?」

先輩

「Java には『可変長引数』という仕組みがあって、いくつでも引数を渡せるメソッドを作ることができるよ。」

新人

「いくつでも渡せるって、どういうことですか?」

先輩

「それじゃあ、可変長引数の基本から説明していこう!」

1. Java の可変長引数とは?(基本的な説明)

1. Java の可変長引数とは?(基本的な説明)
1. Java の可変長引数とは?(基本的な説明)

Java では、メソッドの引数を可変にすることで、渡すデータの数を自由に変更できる仕組みがあります。これを『可変長引数(varargs)』と呼びます。

可変長引数の基本構文

可変長引数は、型の後に ... をつけることで定義できます。


public class VarargsExample {
    // 可変長引数の定義
    public static void printNumbers(int... numbers) {
        for (int num : numbers) {
            System.out.println("数値: " + num);
        }
    }

    public static void main(String[] args) {
        printNumbers(1, 2, 3, 4, 5); // 引数の数を自由に指定できる
    }
}

数値: 1
数値: 2
数値: 3
数値: 4
数値: 5

このように、可変長引数を使うことで、複数の値を渡しても、配列のように扱うことができます。

2. 可変長引数を使うメリットと用途

2. 可変長引数を使うメリットと用途
2. 可変長引数を使うメリットと用途

可変長引数を使うことで、次のようなメリットがあります。

可変長引数のメリット

  • ✔ メソッドの設計が柔軟になり、異なる引数の数にも対応できる
  • ✔ 配列を明示的に作らなくても、簡単に複数の値を渡せる
  • ✔ 必要に応じて、異なる数の引数を処理できる

可変長引数の用途

可変長引数は、以下のような場面でよく使われます。

  • ✔ 計算処理(例:合計を求めるメソッド)
  • ✔ 文字列のフォーマット(例:ログの出力)
  • ✔ データのリストを受け取るメソッド

例えば、合計を求めるメソッドを可変長引数で作成すると、どのような数の引数でも対応できます。


public class SumCalculator {
    public static int sum(int... numbers) {
        int total = 0;
        for (int num : numbers) {
            total += num;
        }
        return total;
    }

    public static void main(String[] args) {
        System.out.println("合計: " + sum(10, 20, 30));
        System.out.println("合計: " + sum(5, 15, 25, 35));
    }
}

合計: 60
合計: 80

このように、可変長引数を使うと、引数の数が異なっても同じメソッドで処理できるため、とても便利です。

3. 可変長引数の基本的な使い方(サンプルコード付き)

3. 可変長引数の基本的な使い方(サンプルコード付き)
3. 可変長引数の基本的な使い方(サンプルコード付き)

可変長引数は、通常のメソッドと同じように使えますが、渡す引数の数を自由に変えられるのが特徴です。

基本的な使い方

例えば、複数の数値の合計を求めるメソッドを可変長引数で実装する場合、以下のように書きます。


public class VarargsExample {
    // 可変長引数のメソッド
    public static int sum(int... numbers) {
        int total = 0;
        for (int num : numbers) {
            total += num;
        }
        return total;
    }

    public static void main(String[] args) {
        System.out.println("合計: " + sum(10, 20, 30));
        System.out.println("合計: " + sum(5, 15));
        System.out.println("合計: " + sum(100));
    }
}

合計: 60
合計: 20
合計: 100

このように、可変長引数を使うことで、異なる数の引数を柔軟に受け取ることができます。

Javaをこれから始める人や、 オブジェクト指向の考え方を基礎から理解したい人には、 定番の入門書がこちらです。

スッキリわかるJava入門 第4版をAmazonで見る

※ Amazon広告リンク

4. 通常の引数と可変長引数の組み合わせ方

4. 通常の引数と可変長引数の組み合わせ方
4. 通常の引数と可変長引数の組み合わせ方

可変長引数は、通常の引数と組み合わせることも可能ですが、いくつかのルールがあります。

通常の引数と可変長引数を一緒に使う

例えば、最初の引数にタイトルを指定し、残りの値を可変長引数で受け取るメソッドを作ることができます。


public class VarargsExample {
    public static void printScores(String title, int... scores) {
        System.out.println(title);
        for (int score : scores) {
            System.out.println("スコア: " + score);
        }
    }

    public static void main(String[] args) {
        printScores("数学のテスト結果", 80, 90, 85);
        printScores("英語のテスト結果", 70, 75);
    }
}

数学のテスト結果
スコア: 80
スコア: 90
スコア: 85
英語のテスト結果
スコア: 70
スコア: 75

このように、通常の引数と組み合わせることで、可変長引数をより便利に使うことができます。

可変長引数は最後に定義する

可変長引数は、メソッドの引数リストの最後に配置しなければなりません。例えば、以下のコードはエラーになります。


public class InvalidVarargs {
    // エラー: 可変長引数が最後にない
    public static void test(int... numbers, String message) {
        System.out.println(message);
    }

    public static void main(String[] args) {
        // test(1, 2, 3, "エラー"); // これはエラーになる
    }
}

このように、可変長引数を定義する際は、必ず最後に置くようにしましょう。

5. 可変長引数を使う際の注意点(制約と制限)

5. 可変長引数を使う際の注意点(制約と制限)
5. 可変長引数を使う際の注意点(制約と制限)

可変長引数は便利な機能ですが、いくつかの制約があるため、注意が必要です。

可変長引数は 1 つのメソッドに 1 つだけ

可変長引数は 1 つのメソッドで 1 つしか定義できません。例えば、以下のように 2 つの可変長引数を定義するとエラーになります。


public class InvalidVarargs {
    // エラー: 可変長引数を 2 つ持つメソッド
    public static void test(int... numbers, String... messages) {
        System.out.println("エラー");
    }
}

このように、可変長引数は 1 つのメソッド内で 1 つまでしか使えません。

可変長引数は内部的に配列として扱われる

可変長引数は、実際には配列として処理されます。そのため、以下のように配列の操作ができます。


public class VarargsExample {
    public static void printArray(int... numbers) {
        System.out.println("配列の長さ: " + numbers.length);
    }

    public static void main(String[] args) {
        printArray(10, 20, 30);
    }
}

配列の長さ: 3

可変長引数を配列のように扱うことで、さまざまなデータの操作ができます。

オーバーロードと競合する可能性がある

可変長引数を使うと、メソッドのオーバーロード(同じ名前のメソッドを複数定義すること)が競合する場合があります。


public class OverloadExample {
    public static void display(int a) {
        System.out.println("int 型のメソッド: " + a);
    }

    public static void display(int... a) {
        System.out.println("可変長引数のメソッド: " + a.length);
    }

    public static void main(String[] args) {
        display(10); // どちらのメソッドが呼ばれる?
    }
}

このコードでは、display(10) を呼び出したときに、どちらのメソッドが実行されるのか Java の仕様によって決まるため、意図しない挙動になる可能性があります。

そのため、可変長引数をオーバーロードする場合は、通常の引数との使い分けを明確にすることが重要です。

6. 可変長引数を活用する実践的な例

6. 可変長引数を活用する実践的な例
6. 可変長引数を活用する実践的な例

可変長引数を活用すると、さまざまな状況で便利に使うことができます。ここでは、実践的な例を紹介します。

複数の文字列を結合する

可変長引数を使って、複数の文字列を結合するメソッドを作成できます。


public class StringUtil {
    // 可変長引数を使って文字列を結合する
    public static String concatenate(String... words) {
        StringBuilder result = new StringBuilder();
        for (String word : words) {
            result.append(word).append(" ");
        }
        return result.toString().trim();
    }

    public static void main(String[] args) {
        System.out.println(concatenate("Java", "可変長引数", "便利"));
        System.out.println(concatenate("これは", "テスト", "です"));
    }
}

Java 可変長引数 便利
これは テスト です

このように、可変長引数を使うことで、異なる数の文字列を簡単に結合できます。

最小値を求める

可変長引数を使えば、複数の数値の中から最小値を求めるメソッドも作成できます。


public class MathUtil {
    public static int min(int... numbers) {
        if (numbers.length == 0) {
            throw new IllegalArgumentException("少なくとも1つの引数を指定してください");
        }

        int minValue = numbers[0];
        for (int num : numbers) {
            if (num < minValue) {
                minValue = num;
            }
        }
        return minValue;
    }

    public static void main(String[] args) {
        System.out.println("最小値: " + min(5, 2, 8, 1, 3));
        System.out.println("最小値: " + min(10, 20, 15));
    }
}

最小値: 1
最小値: 10

このように、可変長引数を活用すると、引数の数を気にせずに柔軟なメソッドを作成できます。

7. 可変長引数を使ったユーティリティメソッドの作成

7. 可変長引数を使ったユーティリティメソッドの作成
7. 可変長引数を使ったユーティリティメソッドの作成

可変長引数は、ユーティリティメソッドを作成するときに特に便利です。ここでは、実用的なユーティリティメソッドの例を紹介します。

配列の平均値を求める

可変長引数を使って、渡された数値の平均値を計算するメソッドを作成できます。


public class MathUtil {
    public static double average(int... numbers) {
        if (numbers.length == 0) {
            throw new IllegalArgumentException("少なくとも1つの引数を指定してください");
        }

        int sum = 0;
        for (int num : numbers) {
            sum += num;
        }
        return (double) sum / numbers.length;
    }

    public static void main(String[] args) {
        System.out.println("平均値: " + average(10, 20, 30, 40, 50));
        System.out.println("平均値: " + average(5, 15));
    }
}

平均値: 30.0
平均値: 10.0

このように、可変長引数を使えば、配列を作らずに手軽に計算ができます。

ログメッセージを出力する

可変長引数を利用して、ログメッセージを出力する便利なメソッドを作ることもできます。


public class Logger {
    public static void log(String level, String... messages) {
        System.out.print("[" + level + "] ");
        for (String message : messages) {
            System.out.print(message + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        log("INFO", "アプリが起動しました");
        log("WARN", "ディスク容量が少なくなっています", "残り500MB");
        log("ERROR", "ファイルが見つかりません", "パス: /data/logs");
    }
}

[INFO] アプリが起動しました
[WARN] ディスク容量が少なくなっています 残り500MB
[ERROR] ファイルが見つかりません パス: /data/logs

このように、可変長引数を使えば、必要な情報を柔軟に渡せるメソッドを作ることができます。

8. 可変長引数を適切に使うためのポイント

8. 可変長引数を適切に使うためのポイント
8. 可変長引数を適切に使うためのポイント

可変長引数は便利ですが、適切に使うためのポイントを押さえておくことが重要です。

可変長引数のパフォーマンスに注意

可変長引数は内部的には配列として処理されるため、大量のデータを渡すとメモリ使用量が増えることに注意が必要です。

引数の数が決まっている場合は通常の引数を使う

可変長引数を使うと便利な場面も多いですが、引数の数が決まっている場合は、通常の引数を使ったほうが明確で読みやすくなります。

null を渡さないように注意

可変長引数のメソッドに null を渡してしまうと、実行時に NullPointerException が発生する可能性があります。常にデータの存在を確認しましょう。


public class SafeVarargs {
    public static void printStrings(String... messages) {
        if (messages == null) {
            System.out.println("エラー: null は渡せません");
            return;
        }
        for (String message : messages) {
            System.out.println(message);
        }
    }

    public static void main(String[] args) {
        printStrings("こんにちは", "Java", "可変長引数");
        printStrings(null); // null を渡すとエラーになる
    }
}

こんにちは
Java
可変長引数
エラー: null は渡せません

このように、可変長引数を使うときは、null をチェックする処理を入れておくと安全です。

Javaのメソッドの一覧へ
新着記事
FlutterのMVP・MVVMアーキテクチャの違いと使い分け
FlutterのMVP・MVVMアーキテクチャの違いと使い分けを初心者向けに解説!
オニオンアーキテクチャの基本とFlutterでの適用例
オニオンアーキテクチャの基本とFlutterでの適用例を初心者向けに解説
クリーンアーキテクチャとは?Flutterでの導入メリット
クリーンアーキテクチャとは?Flutterでの導入メリットをやさしく解説
【AWS】RDS for Oracleの特徴・できないこと・バージョン・料金まとめ
【AWS】RDS for Oracleの特徴・できないこと・バージョン・料金を初心者向けに徹底解説
人気記事
インスタンスタイプの料金比較と最適な選び方(最新2025年版)
AWSのインスタンスタイプの料金比較と最適な選び方【2025年最新版】
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説

🔌 USBポート不足を解消

Type-C 1本で拡張。
開発・作業環境を一気に快適に

UGREEN USB-Cハブを見る

※ Amazon広告リンク