【JAVA】レッスン3-05:ジェネリクスの基礎を理解しよう

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:ジェネリクスの基礎

この記事の練習問題で使用する知識:
基礎構文と制御構造(レッスン1~2)メソッドの定義と呼び出しメソッドの戻り値真偽値を返すメソッドメソッドのオーバーロードジェネリクスの基礎

<<前のページ 問題集Top 次のページ>>

JAVAの「ジェネリクス」とは

この章ではJAVAにおける「ジェネリクス」の意味や使い方を学習します。必要ない方はここをクリックして練習問題へ飛びましょう。

Javaには型をパラメータ化する機能「ジェネリクス」があります。

ジェネリクスを使うことで異なるデータ型に対応したコードの再利用が可能となり、より安全で柔軟なプログラムを記述できます。

しかしジェネリクスの全体像は奥が深く、難解な部分も含まれますので、本記事では初学者向けにジェネリクスの基礎的な部分のみを解説します。

ジェネリクスとは?

ジェネリクスとはメソッドやクラスに、intやStringなどの「型」を変数として渡す仕組みです。

これにより異なるデータ型に応じたコードの再利用が可能になります。

例えば通常であれば整数型や文字列型など異なる型に対応するために複数のメソッドを定義する必要がありますが、ジェネリクスを使うことで一つのメソッドで対応できます。

型の汎用性を持たせたい場面で非常に便利です。

// ジェネリクスの基本構文
private static <T> void printMessage(T n) {
    System.out.println(n);
}

上記のように、<T>と記述することでジェネリクスを用いることができます。

この場合メソッドprintMessageは、引数nの型を自由に指定でき、異なるデータ型に対応します。

ジェネリクスの基本構文

ジェネリクスの基本構文はメソッド名の前に<T>という「型パラメータ」を指定しますが、この<T>はジェネリクスを利用した際に実際の型として置き換わります。

たとえばTStringに置き換えた場合には、printMessage("Hello")のように文字列を扱うことができます。

またIntegerに置き換えた場合にはprintMessage(123)といった具合に整数を処理可能です。

基本的な使用例

以下のコードではジェネリクスを使って異なる型の値を出力するメソッドを作成しています。

public class Main {
    public static void main(String[] args) {
        // 文字列の例
        printMessage("こんにちは");

        // 整数の例
        printMessage(123);

        // 浮動小数点数の例
        printMessage(45.67);
    }

    // ジェネリクスを用いたメソッド
    private static <T> void printMessage(T n) {
        System.out.println("メッセージ: " + n);
    }
}

このコードを実行すると以下のように出力されます。

メッセージ:こんにちは
メッセージ:123
メッセージ:45.67

このコードではprintMessageメソッドが異なるデータ型(文字列、整数、小数)に対応していることが確認できます。

このようにジェネリクスを使用することで、型に依存しないメソッドが簡潔に書けるようになります。

ジェネリクスを使うメリット

ジェネリクスを使う最大のメリットは型の安全性コードの再利用性の向上です。

ジェネリクスを利用することで、コンパイル時に型チェックが行われるため、実行時エラーを未然に防ぐことが可能です。

またコードの再利用性が向上し、同じ機能を持つメソッドやクラスを複数の型に対応させやすくなります。

まとめ

【初心者向け】Javaのメソッドと使い方を分かりやすくまとめた概念図。 特にメソッドの呼び出しや戻り値、メソッドのオーバーロードやジェネリクスについて視覚的に理解できるようまとめている。

ジェネリクスは型をパラメータとして扱える、柔軟で安全なコードを書くための強力な機能です。

本記事では基礎的な部分を紹介しましたが、ジェネリクスの理解を深めるにはさらに多くの学習が必要です。

今後、上級者向けの内容や複雑な使い方について学ぶことで、Javaのプログラムをより効率的に書けるようになります。

練習問題3-5:ジェネリクスを使って配列の要素数を数えよう

ジェネリクスの機能を利用して異なる型の配列の要素数を取得するプログラムを作成しましょう。

このプログラムでは、文字列、整数、小数の配列を作成し、それぞれの配列の要素数を取得して表示します。

この問題の要件

以下の要件に従ってコードを完成させてください。

  1. ジェネリクスを利用した countElements メソッドを作成し、任意の型の配列の要素数を返すこと。
  2. 配列の要素数は array.length を使用して取得すること。
  3. main メソッド内で以下の配列を定義すること。
    • 文字列の配列 {"こんにちは", "ジェネリクス", "Java"}
    • 整数の配列 {1, 2, 3, 4, 5}
    • 小数の配列 {1.1, 2.2, 3.3}
  4. 各配列の要素数を countElements メソッドを使って取得し、出力すること。

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

文字列の配列の要素数: 3
整数の配列の要素数: 5
小数の配列の要素数: 3

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

1:Mainクラスの定義
  □ mainメソッドの定義
  □ □ String型の配列wordsを作成し、要素「こんにちは」「ジェネリクス」「Java」を格納
  □ □ 「文字列の配列の要素数: 」とcountElementsメソッドで取得したwordsの要素数を出力
  □ □ Integer型の配列numbersを作成し、要素1, 2, 3, 4, 5を格納
  □ □ 「整数の配列の要素数: 」とcountElementsメソッドで取得したnumbersの要素数を出力
  □ □ Double型の配列decimalsを作成し、要素1.1, 2.2, 3.3を格納
  □ □ 「小数の配列の要素数: 」とcountElementsメソッドで取得したdecimalsの要素数を出力
  □ ジェネリクスを使用したcountElementsメソッドの定義
  □ □ 配列arrayの長さ(要素数)をarray.lengthで取得し、戻り値として返す

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

public class Main {
    public static void main(String[] args) {
        // 文字列の配列を作成
        /*【穴埋め問題1】
        ここにString型の配列wordsを作成し、「こんにちは」「ジェネリクス」「Java」を格納してください。
        */
        // countElementsメソッドを使って要素数を出力
        System.out.println("文字列の配列の要素数: " + countElements(words));

        // 整数の配列を作成
        /*【穴埋め問題2】
        ここにInteger型の配列numbersを作成し、1, 2, 3, 4, 5の値を格納してください。
        */
        // countElementsメソッドを使って要素数を出力
        System.out.println("整数の配列の要素数: " + countElements(numbers));

        // 小数の配列を作成
        /*【穴埋め問題3】
        ここにDouble型の配列decimalsを作成し、1.1, 2.2, 3.3の値を格納してください。
        */
        // countElementsメソッドを使って要素数を出力
        System.out.println("小数の配列の要素数: " + countElements(decimals));
    }
    
    /*【穴埋め問題4】
    ここにジェネリクスを使ったcountElementsメソッドを定義し、配列の要素数をarray.lengthで返すコードを書いてください。
    */
}

以上がこの問題の穴埋めコードです。

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。



解答例と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

public class Main {
    public static void main(String[] args) {
        // 文字列の配列を作成
        String[] words = {"こんにちは", "ジェネリクス", "Java"};
        // countElementsメソッドを使って要素数を出力
        System.out.println("文字列の配列の要素数: " + countElements(words));

        // 整数の配列を作成
        Integer[] numbers = {1, 2, 3, 4, 5};
        // countElementsメソッドを使って要素数を出力
        System.out.println("整数の配列の要素数: " + countElements(numbers));

        // 小数の配列を作成
        Double[] decimals = {1.1, 2.2, 3.3};
        // countElementsメソッドを使って要素数を出力
        System.out.println("小数の配列の要素数: " + countElements(decimals));
    }
    private static <T> int countElements(T[] array) {
        // 配列の長さ(要素数)を返す
        return array.length;
    }
}

正解コードの解説

以下のコードは「ジェネリクス」の基本的な使い方を学ぶためのJavaプログラムです。

ジェネリクスとは異なる型を一つのメソッドやクラスで扱えるようにするための仕組みで、ここでは配列の要素数をカウントするメソッドで利用しています。

クラスとメインメソッドの定義

public class Main {
    public static void main(String[] args) {

ここではMainクラスと、その中に含まれるmainメソッドを定義しています。

mainメソッドはJavaプログラムが最初に実行するエントリーポイントです。

文字列の配列を作成し要素数をカウント

String[] words = {"こんにちは", "ジェネリクス", "Java"};
System.out.println("文字列の配列の要素数: " + countElements(words));

ここではString型の配列wordsを定義し、「こんにちは」「ジェネリクス」「Java」の3つの要素を格納しています。

その後countElementsメソッドを使って配列の要素数をカウントし、結果を出力します。

整数の配列を作成し要素数をカウント

Integer[] numbers = {1, 2, 3, 4, 5};
System.out.println("整数の配列の要素数: " + countElements(numbers));

ここではInteger型の配列numbersを定義し、1から5までの整数を格納しています。

同様にcountElementsメソッドを使用して要素数を出力します。

小数の配列を作成し要素数をカウント

Double[] decimals = {1.1, 2.2, 3.3};
System.out.println("小数の配列の要素数: " + countElements(decimals));

Double型の配列decimalsを定義し、小数3つを格納しています。

countElementsメソッドを用いてこの配列の要素数も出力しています。

ジェネリクスを使った要素数カウントメソッドの定義

private static <T> int countElements(T[] array) {
    return array.length;
}

ここで定義しているのがジェネリクスを用いたcountElementsメソッドです。

<T>と記述することで配列の要素の型を特定の型に固定せず、どの型の配列も引数として受け取れるようにしています。

Tは「任意の型」を意味する型パラメータで、配列の型に依存せずにcountElementsメソッドが動作することを可能にしています。

まとめ

このコードではJavaのジェネリクスを使って異なる型の配列(文字列、整数、小数)に対して同じメソッドで要素数を取得する方法を学びました。

ジェネリクスは柔軟性と再利用性を高める重要な機能で、さまざまな型のデータを扱うメソッドやクラスを作成するのに役立ちます。

今後もジェネリクスを活用して、より多機能で効率的なプログラムを作成できるようにしていきましょう。

<<前のページ 問題集Top 次のページ>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    JAVAテキスト&問題集へ戻る
    トップページへ戻る