18 プログラムを整理する(オーバーロード)

【第18回】プログラムを整理する(オーバーロード)

今回はプログラミングテクニックの一部を紹介します。

前提:複数のメソッドを使用してプログラミングをした事がある。

同じような処理(ケースによって若干の違いがある場合)を別のメソッドで作成した場合、
その度に違うメソッド名をつけた経験がありませんか?
処理の内容が同じであれば、同じメソッド名をつけたいですよね。
それを実現するのが「メソッドのオーバーロード」です。

それでは早速リスト1を見て見ましょう。

リスト1 – OverLoadTest.java

// オーバーロードテストクラス
public class OverLoadTest
{
    private String displayName_;
		
    public OverLoadTest()
    {
        displayName_ = null;
    }


    // 表示名称設定
    public void setName(String name)
    {
        displayName_ = name;
    }


    // 設定名称表示メソッド
    public void printName()                                 // (1)
    {
        String line = "私は" + displayName_ + "です";
        System.out.println(line);
    }


    // 指定名称表示メソッド
    public void printName(String name)                      // (2)
    {
        String line = "私は" + name + "です";
        System.out.println(line);
    }


    public static void main(String[] args)
    {
        OverLoadTest overLoad = new OverLoadTest();

        // 表示する名称を設定する
        overLoad.setName("山田");

        // 設定した名称を表示する
        overLoad.printName();

        // 指定した名称を表示する
        overLoad.printName("山田太郎");
    }
}

実行結果は

C:\work>javac OverLoadTest.java

C:\work>java OverLoadTest
私は山田です
私は山田太郎です

C:\work>

(1)では引数を何も指定せずにprintNameメソッドを呼び出しています。
この場合は、setNameメソッドで指定した名前「山田」を出力していますね。
では、(2)はどうでしょう。
ここでは引数で指定した「山田太郎」を出力しています。
メソッド名は(1)と同じですが、コンパイルエラーはでませんでしたよね。
これは、(1)と(2)では呼び出し方が異なるため、別のメソッドとして扱われているのです。

ここで、同じ呼び出し方のメソッドをもうひとつ追加してコンパイルしてみましょう。

    // 指定名称表示メソッドその2
    public void printName(String otherName)
    {
        String line = "My Name is " + otherName + ".";
        System.out.println(line);
    }
C:\work>javac OverLoadTest.java
OverLoadTest.java:36: printName(java.lang.String) は OverLoadTest 
で定義されています。
    public void printName(String otherName)
                ^
エラー 1 個

C:\work>

エラーがでましたよね。 そうです。呼び出し方が同じメソッドは2つ以上定義する事はできないのです。

さて、同じメソッド名を作成した場合でも、 リスト1のようにそれぞれのメソッドで同じことをさせるのは良いプログラムとは言えません。 ここでprintNameに「苗字」と「名前」を引数とするメソッドを追加した例をお見せしましょう。

リスト2 – OverLoadTest.java

// オーバーロードテストクラス
public class OverLoadTest
{
    private String displayName_;
		
    public OverLoadTest()
    {
        displayName_ = null;
    }


    // 表示名称設定
    public void setName(String name)
    {
        displayName_ = name;
    }


    // 設定名称表示メソッド
    public void printName()
    {
        printName(displayName_);                            // (1)
    }


    // 指定名称表示メソッド(苗字、名前)
    public void printName(String firstName, String lastName)
    {
        String name = firstName + lastName;
        printName(name);                                    // (2)
    }


    // 指定名称表示メソッド
    public void printName(String name)                      // (3)
    {
        String line = "私は" + name + "です";
        System.out.println(line);
    }


    public static void main(String[] args)
    {
        OverLoadTest overLoad = new OverLoadTest();

        // 表示する名称を設定する
        overLoad.setName("山田");

        // 設定した名称を表示する
        overLoad.printName();

        // 指定した名称を表示する
        overLoad.printName("山田太郎");

        // 指定した名称(苗字・名前)を表示する
        overLoad.printName("山田", "太郎");
    }
}

結果は次のようになります。

C:\work>javac OverLoadTest.java

C:\work>java OverLoadTest
私は山田です
私は山田太郎です
私は山田太郎です

C:\work>
            

リスト2の(1)と(2)は(3)を呼び出しています。
これによって、
・出力する処理(System.out.println)が1箇所となり、間違いがあっても直す箇所が少ない。
・何度も同じ処理を書く必要が無いのでプログラムがシンプルになる。
といったメリットがあります。
この考え方は、「オーバーロード」を使用する場合に限らず、整理してプログラミングをする上でも
重要な考え方になりますので、覚えておいて損はないでしょう。

~まとめ~
1.同一メソッド名で呼び出し方が異なる複数のメソッドを作成できる
2.同じ処理は複数のメソッドに持たせずに整理する

今回の「オーバーロード」を試す機会が思いつきますか?
これまでに作成したプログラムを整理しながら、活用方法を考えてみて下さいね