【Java入門】独自の関数を作る方法(引数、戻り値)

投稿日: 作成:   更新:

Javaの関数について解説します。

  • 関数とは何だろう?
  • 関数の書き方が知りたい。
  • 関数の処理をまとめる方法が知りたい。
  • どんな時に関数を作成するんだろう?

このような内容について解説します。

私はWEB開発中心に、フロントエンド、サーバーサイド、サーバー構築など経験豊富なエンジニアです。
これからプログラミングを始める方に向けて、少しでも分かりやすく解説していきたいと思います。

独自の関数を作成できるようになると、同じ処理を書かずにソースコードがスッキリと読みやすくなります。

今回、関数について基本的な作り方から、どんな時に関数を作るのか?について、
手順や考え方について解説します。

それでは行きましょう!

関数とは

処理を1箇所にまとめる箱のようなものです。

関数は「何を渡したら(引数)、何が返ってくる(戻り値)」のインプット・アウトプットを意識して作成します。

関数のイメージを表すとしたら、次のような感じでしょうか。

関数の呼び出しイメージ:

引数を関数に渡して、関数が戻り値を返します。
このようにインプット・アウトプットを意識しましょう。

インプット・アウトプットについて1つ例えると、

「両替機(関数)に千円(引数)を渡したら、
  両替機(関数)の中で何やっているか分からないけど、
   100円玉が10枚(戻り値)出てきた。」

のようなイメージでしょうか。

関数の基本的な書き方

関数の書き方について説明します。

関数の書き方イメージ

関数の書き方についてのイメージと表を作りました。

関数イメージ:

番号名称意味
アクセス修飾子関数の公開範囲を指定します。
「public、protected、private」のいずれかを指定します。
戻り値の型returnで返す値の型を記載します。
関数名自分で好きな関数名称を指定する
引数呼び出し元から受け取る値の「型と変数名」を指定する
戻り値「return」で呼び出し元に返す

次に実際に関数を書いてみましょう。

ちなみに「引数、戻り値がないパターン」や「引数があって、戻り値がないパターン」とかもありますが、

今回は引数、戻り値の両方あるパターンと両方ないパターンを説明します。

引数、戻り値があるパターン

次では「指定した引数に10を加算する独自関数」addTenをあらかじめ関数宣言しておいて、呼び出し元でprintln()で表示するソースコードです。

package sample;

public class Sample {
    public static void main(String[] args) {
        // 呼び出し元
        Integer answer = addTen(5);
        System.out.println(answer);
    }

    // 指定した引数に10を加算する独自関数
    public static Integer addTen(Integer value) {
        return value + 10;
    }
}

実行結果:

呼び出し元で「addTen(関数)」を呼んで「5(引数)」を渡していたので、「15(戻り値)」が返ってきた値をprintln()で表示しています。

「static」について

ソースコードに「static」が記載されていますが、今回は「static」については触れませんので、よろしくお願いします。

mainメソッドから直接呼び出す関数は「static」が付くと認識いただければと思います。

引数、戻り値の両方ないパターン

引数は()の中を空にすればOKですが、
戻り値は「void」を指定する必要があります。

例として「printHelloWorld()」関数を作りました。
関数が呼び出されると「Hello World!!」を表示してくれる独自関数です。

package sample;

public class Sample {
    public static void main(String[] args) {
        // 呼び出し元
        printHelloWorld();
    }

    // 「Hello World!!」を出力する独自関数
    public static void printHelloWorld() {
        System.out.print("Hello World!!");
    }
}

実行結果:

printHelloWorld()関数を呼び出しただけで表示することができました。

どんな時に関数を作成するのか

同じ処理が2回以上あるとき、関数を作るキッカケになりますね。

次のソースコードは、バナナとイチゴの税込価格(消費税10%)を表示する処理です。

package sample;

public class Sample {
    public static void main(String[] args) {
        // バナナの定価
        double bananaPrice = 100;

        // イチゴの定価
        double strawberryPrice = 500;

        // バナナの定価に消費税10%を加算して表示
        System.out.println("バナナの税込価格:");
        double answer1 = bananaPrice + (bananaPrice * 0.1);
        System.out.println( (int)answer1 );

        // イチゴの定価に消費税10%を加算して表示
        System.out.println("イチゴの税込価格:");
        double answer2 = strawberryPrice + (strawberryPrice * 0.1);
        System.out.println( (int)answer2 );
    }
}

実行結果:

このソースコードの中に同じ処理があります。
それは「消費税10%を加算」の部分です。

この「消費税10%を加算」を関数化して「calcTax」として呼び出すように変更してみます。

package sample;

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

        // 呼び出し元の処理

        int bananaPrice = 100;
        int strawberryPrice = 500;

        System.out.println("バナナの税込価格:");
        System.out.println( calcTax(bananaPrice) );

        System.out.println("イチゴの税込価格:");
        System.out.println( calcTax(strawberryPrice) );
    }

    // 消費税10%を加算する独自関数
    public static int calcTax(int value) {
        double answer = value + (value * 0.1);

        // int型に変換して返す(小数点を切り捨てるため)
        return (int) answer;
    }
}

結果は先ほどと同じです。

同じ処理を関数化することができました。

なぜ関数にするのか

先ほどの同じ処理をcalcTax関数に処理をまとめたように、関数にすることで呼び出し元の処理がスッキリとして可読性(見やすくなる)が良くなります

また、関数を他の呼び出し元で再利用することもできます。

実際の開発では関数は別クラスにあることが多いため、それを取り込んで(import)使用します。

初心者の方への注意点として、
最初から関数を作ろうとしないことが大切です。

最初から関数を作ると、何の目的で作られたのか分からなくなってしまいます。
まずは同じ処理を発見して、それから1箇所の関数にまとめると良いと思います。

では、どういう風に関数を作るのかを、次の「関数を作る手順」で解説します。

関数を作る手順

関数を作るときは次の手順を踏むと良いでしょう。

関数を作る手順

  • ①素直に処理を書いてみる
  • ②処理の中から変数を明確にする
  • ③関数化してみる

1つずつソースコードで説明します。

①素直に処理を書いてみる

まずは素直にそのまま処理を書いてみます。

次のソースコードは、システム日付が”2021/02/19″のときに誕生日を知らせてくれる処理となります。

Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("y/MM/dd");

String dateStr = sdf.format(date);

if (dateStr.equals("2021/02/19")) {
    System.out.println("今日「" + dateStr + "」は、あなたの誕生日です。");
} else {
    System.out.println("今日「" + dateStr + "」は、何でもない日です。");
}

②処理の中で変数を明確にする

①で書いた処理の中で、変数を明確化します。

明確化するコツとしては、次の2つがあります。
 1.何となく付けている変数名を分かりやすく変更する
 2.文字列など直接書いている値を変数にする。
このことを意識すると良いです。

早速、変数を明確化してみます。

Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("y/MM/dd");

// [1] 「今日の日付」であることが分かるように変数名を変更
String today = sdf.format(date);

// [2] 「あなたの誕生日」が分かるように値を変数にした
String yourBirthday = "2021/02/19";

if (today.equals(yourBirthday)) {
    System.out.println("今日「" + today + "」は、あなたの誕生日です。");
} else {
    System.out.println("今日「" + today + "」は、何でもない日です。");
}

[1]
「dateStr」となんとなく「日付文字列」の意味合いで付けていた変数名ですが、
Javaは変数に必ず型を指定しますので、変数名に型を含める必要はありませんね。

「today」に変更して「今日の日付」であることを変数名から読み取れるように変更します。

[2]
直接値を書いている「”2021/02/19″」については、何の値かがコメント記述でもされていない限り分かりません。
このような値は変数にしておきましょう。

「yourBirthday」の変数を作成して、「あなたの誕生日」であることを変数から読み取れるようにしました。

③関数化してみる

②までできていれば、関数のインプット(引数)はイメージつくと思います。
あとはアウトプット(戻り値)です。

戻り値は「関数に何を任せるのか」を意識すると、関数化しやすいです。

また、引数が多かったりすると、関数を呼び出すのが大変ですので、
 「呼び出し元が複雑にならないように、簡単に呼び出せるようにする
と意識するのも関数化しやすいと思います。

package sample;

import java.text.SimpleDateFormat;
import java.util.Date;

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

        // 呼び出し元
        System.out.println( getBirthdayMessage("2021/02/19") );
    }

    // 指定された日付が今日であれば、あなたの誕生日であるとメッセージを返す
    public static String getBirthdayMessage(String yourBirthday) {

        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("y/MM/dd");

        String today = sdf.format(date);

        if (today.equals(yourBirthday)) {
            return "今日「" + today + "」は、あなたの誕生日です。";
        } else {
            return "今日「" + today + "」は、何でもない日です。";
        }
    }
}

今回は、インプットに日付を渡すことで「今日が誕生日かを判定してメッセージを返す」処理getBirthdayMessageを作ってみました。

これにより、呼び出し元が1行になりスッキリとしましたね。

関数名は任意ですので、呼び出し元が直感的に何をする処理なのか分かるようにすると良いと思います。

関数名を「動詞 + ○○」で書くのが一般的ですね。
今回は「get + BirthdayMessage」としました。

この関数の意味は「今日かどうかを判定して、誕生日メッセージを返す」です。
これを正しく関数名に書くとなると「getBirthdayMessageByJudgementToday()」となります。

ですが、関数名が長すぎると逆に分かりにくくなりますので、ある程度の意味が伝わるくらいに短くした方が良いと思います。

関数名、変数名のつけ方はこの本に分かりやすく書いてますので、時間があれば読んでみるのも良いでしょう。

まとめ

Javaの独自の関数を作る方法について解説しました。

  • 関数とは(インプット・アウトプット)
  • 関数の書き方(関数イメージ、引数、戻り値)
  • どんな時に関数を作成するのか(同じ処理が2回以上あるとき)
  • なぜ関数にするのか(可読性、再利用が目的)
  • 関数を作る手順(変数を明確にして関数化する)

色々と書きましたが、初めのうちは「頑張って関数にしなくても良い」と思います。

まずは、素直にそのままのソースコードで書いてみて、Javaの基本的な書き方をつかめてから関数化に挑んでも良いでしょう。