未来エンジニア養成所Blog

プログラミングを皆に楽しんでもらうための情報をお届けします。

【Java】メソッドの作成 Part 2

title

前回に引き続き、メソッドを作成し、それを利用する方法を確認しましょう。

前回の記事はこちら。

phoeducation.work


戻り値のあるメソッド

戻り値とは、処理の結果を返すためのものです。

メソッドによっては、処理そのものが重視されるタイプのメソッド(System.out.println( )などは画面への文字出力が重視され、戻り値は重要ではない)もありますが、例えば、演算をしてその結果を返すのが重要なメソッドもあります。

そういった場合に戻り値が必要となります。


戻り値を返すメソッドは以下のように記述します。

[static] 戻り値の型 メソッド名(引数リスト){
    メソッドの中身;
    retrun 戻り値のデータ;
}


実際に戻り値として返す値は、「return文」で指定します。

戻り値のデータには、変数または定数を記述できます。
但し、戻り値のデータ型は、メソッドの戻り値の宣言をした型と一致していなくてはなりません。


例えば、以下のようなメソッドが宣言されていた場合、このメソッドの内部でreturnできるのはint型のみとなります。

static int max(int num1, int num2){ }


例えば、上記のメソッドmaxがint型の戻り値を返すとしましょう。
すると、メソッドの全体は以下のようになります。

戻り値


return
戻り値を返す必要のないメソッドであれば戻り値をvoid と指定します。
また、戻り値がvoidであれば、returnを省略することもできます。
戻り値は必ずメソッドの宣言で指定した型と合致するデータを指定してください。
return文はメソッドを終了し、戻り値として指定された値を返します。


return 文を用いる場所
return文はメソッドを終了し、戻り値として指定された値を返す意味があります。
ですから、return文の後にはどのような処理も来ないはずです。
そこで、Javaではreturn文の後に処理が続く場合、これをコンパイルエラーとしてしまいます。
そのため基本的にはreturn文はブロックの1番最後に来ます。


【戻り値を持つメソッド】

public class ReturnValue{
    public static void main(String[ ] args){
        int ret, data = 10;
        ret = max(data, 30);
        System.out.println("戻り値は : " + ret);
    }
    // メソッドの定義
    static int max(int num1, int num2){
        if(num1 > num2){
            return num1;
        }
        return num2;
    }
}


実行結果

戻り値は : 30


メソッドの呼び出しは4行目で行っています。
ここではmaxという名前のメソッドにint型の変数dataと整数の30を渡して、その2つの値を比較した結果をint型の変数retに代入しています。


メソッドの処理としてはif文による値の大小を比較しているだけのものです。
そして大きい方の値を返すようにしています。

結果を戻り値として返している部分が10行目と12行目になります。今回はint型を返すメソッドとして作成しています。
num1またはnum2はint型ですので問題なく値を返せます。


メソッドのオーバーロード

メソッドの「オーバーロード」とは、複数のメソッドに同一の名前をつけることです。

例えば、int型の2つの値を比較して大きい方の値を返す、メソッドを作成したとします。
作成してみると次のようになるはずです。

static int max(int a, int b){
    if(a > b){
        return a;
    }
    return b;
}


ところで、このmaxメソッドは引数や戻り値がint型です。
もし、double型を用いた同様の処理を行うメソッドが欲しくなったらどうでしょうか?

当然、現状ではint型のmax( )メソッドしかありませんので、double型のmax( )メソッドを作ることになります。

static double max(double num1 , double num2){
    if(num1 > num2){
        return num1;
    }
    return num2;
}


このように、同一メソッド名で、引数の型が違うメソッドを作成しました。
これが、「オーバーロード」です。


オーバーロードが成立する条件
オーバーロードをするためには、オーバーロードするメソッド間で、次のいずれかを満たしている必要があります。
もし満たしていなければ、コンパイルエラーとなりますので注意してください。

  • 引数の数が違う
  • 引数の型が違う
  • 引数の並びが違う(データ型の並び)


メソッドの区別の方法
Javaではメソッドの区別はメソッドの名称及び引数リストで行い、この2つを合わせて、メソッドの「シグネチャ」と呼びます。 戻り値の型だけが違う場合は同じメソッドが複数あることになり、コンパイルエラーになりますので注意してください。


【オーバーロード】

public class ReturnValue2{
    public static void main(String[ ] args){
        int ret, data = 10;
        ret = max(data, 30);
        System.out.println("戻り値は : " + ret);
        double result, value = 12.3;
        result = max(value, 98.7);
        System.out.println("戻り値は : " + result);
    }
    // int型メソッドの定義
    static int max(int num1, int num2){
        if(num1 > num2){
            return num1;
        }
        return num2;
    }
    // double型メソッドの定義
    static double max(double num1, double num2){
        if(num1 > num2){
            return num1;
        }
        return num2;
    }
}


実行結果

戻り値は : 30
戻り値は : 98.7


このプログラムで注意する部分は11行目と18行目で、同じ名前のメソッドを2つ定義していることです。


この2つのメソッドを次のように呼び出しています。

    int ret, data = 10;
    ret = max(data, 30);
    System.out.println("戻り値は : " + ret);
    double result, value = 12.3;
    result = max(value, 98.7);
    System.out.println("戻り値は : " + result);

ここで2つあるメソッドmaxの区別は引数の型で行っています。
4行目は、「引数がint型とint型の並びになっているmax( )メソッド」であり、 7行目は、「引数がdouble型とdouble型の並びになっているmax( )メソッド」を呼び出しています。


オーバーロードされたメソッドの呼び分け
オーバーロードされたメソッドは、呼び出し側の引数として、どういうデータ型が渡されているのかで判断しています。


可変長引数

通常、メソッドを定義する際、引数のデータ型と数を決めておいて、呼び出しの際には、そのデータ型と数を定義に合わせて指定して、メソッドを呼び出します。

可変長引数を使用すると、メソッドの引数の数をあらかじめ決めておかないで、呼び出しのときに決めることができます。


オーバーロードの場合

上の例のように、メソッドがオーバーロードされている場合、該当のメソッドを呼び出すには、メソッドで定義されている引数のデータ型と引数の数に合わせて実引数を指定して呼び出す必要があります。


可変長引数の場合

可変長で引数を指定しておくと、1つの引数定義で、複数の呼び出しに対応することができます。


【可変長引数の書式】

メソッド名(可変長引数の型...変数名){処理}
(例)void main(String...args)

可変長引数の書式はデータ型の後にドットを3つ付け、変数名を指定します。


【可変長引数 書式】

public class VariableArgs {
    public static void main(String[] args) {
        System.out.println("一回目:引数1つで呼ぶ");
        variableArgs("A");
        System.out.println("二回目:引数2つで呼ぶ");
        variableArgs("A","B");
        System.out.println("三回目:引数3つで呼ぶ");
        variableArgs("A","B","C");
    }
    //可変長引数をもつメソッドの定義
    public static void variableArgs(String... str) {
        for(String s : str) {
            System.out.println(s);
        }
    }
}


実行結果

一回目:引数1つで呼ぶ
A
二回目:引数2つで呼ぶ
A
B
三回目:引数3つで呼ぶ
A
B
C

このプログラムでは11行目から15行目でvariableArgsメソッドを定義しています。
このメソッドの引数は、String型の可変長引数が定義されています。

12行目から14行目の処理の内容は、可変長引数strに格納された複数のデータを、拡張for文を使用して、1つずつSitring型の変数sに代入しては、出力をします。


4行目ではこのvariableArgsメソッドを、引数を1つだけ指定して呼び出しています。


6行目ではこのvariableArgsメソッドを、引数を2つ指定して呼び出しています。


8行目ではこのvariableArgsメソッドを、引数を3つ指定して呼び出しています。


このようにvariableArgsメソッドの引数定義に可変長引数を指定すると、実際にメソッドを呼び出す際に、複数の実引数に対応することができます。


まとめ

  • 戻り値のあるメソッド 処理の結果を返す場合は、戻り値を利用します。戻り値を返す場合は、return文を利用します。

  • メソッドのオーバーロード 複数のメソッドに同一の名前を付けることを、メソッドのオーバーロードと言います。

  • 可変長引数 メソッドの引数に可変長引数を指定すると、複数の実引数を、1つのメソッドで実行することができます。


参考図書



独学で挫折しそうになったら、オンラインプログラミングスクール
未来エンジニア養成所Logo



あわせて学習したい

phoeducation.work phoeducation.work