JavaA2Z

KAB-studio > プログラミング > JavaA2Z > 戻り値とは

戻り値

日本語 戻り値
英語 return value
ふりがな もどりち
フリガナ モドリチ

解説

メソッドが返すことのできるたったひとつの値。
メソッドは、そのメソッドから抜ける際に値をひとつだけ呼び出し元に返すことができる。この値が「戻り値」である。「返り値」とも言う。
 
メソッドreturnを使用してメソッドから抜けると同時に値を返すことができる。
値のメソッド宣言で「戻り値の メソッド( 引数 )」の形式で指定する。戻り値を返さない場合にはvoidを指定する。

戻り値は、「メソッド呼び出し箇所が戻り値に置き換わる」と考えると分かりやすい。
int result = returnInt();」の「returnInt()メソッドが「100」を返すのであれば、呼び出し後に「int result = 100;」と置き換わったと考えると分かりやすい。

戻り値のクラスの場合、その戻り値を使用してメソッド呼び出すことがある。そういった複雑なプログラムを読み解く場合、このように「置き換わる」と考えて読むと分かりやすいだろう。
 
戻り値は値をひとつしか返すことができず、さらにも決められている。
戻り値から複数の値を返すことはできない。複数の値を返したい場合、その複数の値をフィールドとして持つクラス定義し、そのクラスを戻り値のとして指定し、メソッドではそのクラスインスタンスへの参照returnで返すことで、複数の値を返すことができる。

その他の方法としては、戻り値を使用せず、引数としてクラスインスタンスへの参照を受け取り、そのクラスに格納するという方法もある。
C言語C++言語ではよく使われる方法だが、Javaでは滅多に使用されない。
 
「複数の値を返すメソッド」を作るのは、面倒である。かといって、ArrayListHashMapを使用して複数の値を返すのは言語同断である。
設計上の理想論を言えば、メソッドの戻り値から複数の値を返す場合、「その複数の値を持つクラス」が存在し、それを返すべきである。もしその複数の値がお互いに全く関係ないのであれば、その全く関係ない複数の値を返すようなメソッドは意味的に問題があると言える。

参考サイト

  • (参考サイトはありません)

(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        Sample sample = new Sample();
        // returnInt()メソッドを呼び出します。
        int result = sample.returnInt();
        System.out.println( result );
        // 100
        // resultには、returnInt()メソッド内のローカル変数i中に
        // 格納されていた値100のコピーが格納されました。
        // この値が「戻り値」になります。

        // 戻り値は「メソッドを戻り値の値に置き換える」と考えると
        // 分かりやすいでしょう。
        // たとえば、以下のような複雑な処理の場合。
        int hashcode = Integer.valueOf( "100" ).toString().hashCode();
        // 左から見ていきます。まず「Integer.valueOf( "100" )」が
        // 呼び出され、戻り値としてIntegerクラスの参照が返されます。
        // int hashcode = 「Integerクラスの参照」.toString().hashCode();
        // 次に『「Integerクラスの参照」.toString()』を呼び出します。
        // 戻り値としてStringクラスの参照が返されます。
        // int hashcode = 「Stringクラスの参照」.hashCode();
        // 最後に『「Stringクラスの参照」.hashCode()』が呼び出され、
        // ハッシュ値が戻り値として返されます。
        // int hashcode = ハッシュ値;
        // このハッシュ値が代入される、というわけです。
        // このように、戻り値からメソッドが呼び出されている場合には、
        // 「メソッドの呼び出し部分が戻り値の値に置き換わる」と考えると
        // 分かりやすいでしょう。

        // 戻り値を返さないメソッドを呼び出す場合は、戻り値を受け取りません。
        // 戻り値を返さない、notReturn()メソッドを呼び出します。
        sample.notReturn();
        // Sample#notReturn()

        // むしろ受け取るとコンパイルエラーになります。
        // ※コンパイルエラーの例
        // Object object = sample.notReturn();
        // ※エラーメッセージ
        // 型の不一致: void から Object には変換できません。
        // ※コンパイルエラーの例ここまで

        // 複数の値を戻り値から返す方法。
        Data data = sample.returnData();
        System.out.println( data.number );
        System.out.println( data.name );
        // 200
        // あいうえお

        // このように、クラスのインスタンスへの参照を戻り値として
        // 返してもらえば、複数の値を受け取ることができます。
    }

    /**
     * 戻り値の型がintのメソッド。
     */
    private int returnInt()
    {
        int i = 100;
        // returnで戻り値を返します。
        return i;
        // あくまで、iの中身をコピーして返しています。
        // iそのものを返しているわけではないので注意してください。

        // 全然関係ない型を返すことはできません。
        // ※コンパイルエラーの例
        // return "あいうえお";
        // ※エラーメッセージ
        // 型の不一致: String から int には変換できません。
        // ※コンパイルエラーの例ここまで
    }

    /**
     * 戻り値の型がvoidのメソッド。
     */
    private void notReturn()
    {
        System.out.println( "Sample#notReturn()" );
        // 戻り値を返す必要がない場合には、戻り値の型をvoidにしましょう。
        // そうすれば戻り値を返さなくて済みます。
    }

    /**
     * 戻り値から複数の値を返す方法。
     */
    private Data returnData()
    {
        // Dataクラスのインスタンスを作り、その中に値をセットします。
        Data data = new Data();
        data.number = 200;
        data.name = "あいうえお";
        // そして、そのインスタンスへの参照を戻り値として返します。
        return data;

        // 同じような事をArrayListやHashMapでもできますが、
        // 絶対にしないようにしましょう。なぜなら、
        // どんな型がセットされているのか、returnData()メソッドの
        // 実装を見なければならないからです。
    }
}

/**
 * 複数のデータを持つクラス。
 */
class Data
{
    // ※フィールドのアクセス修飾子をpublicにしていますが、
    // 皆さんは礼儀正しくprivateにして、
    // getter/setterを作ってください。
    public int number;
    public String name;
}
// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        Sample sample = new Sample();
        // returnInt()メソッドを呼び出します。
        int result = sample.returnInt();
        System.out.println( result );
        // 100
        // resultには、returnInt()メソッド内のローカル変数i中に
        // 格納されていた値100のコピーが格納されました。
        // この値が「戻り値」になります。

        // 戻り値は「メソッドを戻り値の値に置き換える」と考えると
        // 分かりやすいでしょう。
        // たとえば、以下のような複雑な処理の場合。
        int hashcode = Integer.valueOf( "100" ).toString().hashCode();
        // 左から見ていきます。まず「Integer.valueOf( "100" )」が
        // 呼び出され、戻り値としてIntegerクラスの参照が返されます。
        // int hashcode = 「Integerクラスの参照」.toString().hashCode();
        // 次に『「Integerクラスの参照」.toString()』を呼び出します。
        // 戻り値としてStringクラスの参照が返されます。
        // int hashcode = 「Stringクラスの参照」.hashCode();
        // 最後に『「Stringクラスの参照」.hashCode()』が呼び出され、
        // ハッシュ値が戻り値として返されます。
        // int hashcode = ハッシュ値;
        // このハッシュ値が代入される、というわけです。
        // このように、戻り値からメソッドが呼び出されている場合には、
        // 「メソッドの呼び出し部分が戻り値の値に置き換わる」と考えると
        // 分かりやすいでしょう。

        // 戻り値を返さないメソッドを呼び出す場合は、戻り値を受け取りません。
        // 戻り値を返さない、notReturn()メソッドを呼び出します。
        sample.notReturn();
        // Sample#notReturn()

        // むしろ受け取るとコンパイルエラーになります。
        // ※コンパイルエラーの例
        // Object object = sample.notReturn();
        // ※エラーメッセージ
        // 型の不一致: void から Object には変換できません。
        // ※コンパイルエラーの例ここまで

        // 複数の値を戻り値から返す方法。
        Data data = sample.returnData();
        System.out.println( data.number );
        System.out.println( data.name );
        // 200
        // あいうえお

        // このように、クラスのインスタンスへの参照を戻り値として
        // 返してもらえば、複数の値を受け取ることができます。
    }

    /**
     * 戻り値の型がintのメソッド。
     */
    private int returnInt()
    {
        int i = 100;
        // returnで戻り値を返します。
        return i;
        // あくまで、iの中身をコピーして返しています。
        // iそのものを返しているわけではないので注意してください。

        // 全然関係ない型を返すことはできません。
        // ※コンパイルエラーの例
        // return "あいうえお";
        // ※エラーメッセージ
        // 型の不一致: String から int には変換できません。
        // ※コンパイルエラーの例ここまで
    }

    /**
     * 戻り値の型がvoidのメソッド。
     */
    private void notReturn()
    {
        System.out.println( "Sample#notReturn()" );
        // 戻り値を返す必要がない場合には、戻り値の型をvoidにしましょう。
        // そうすれば戻り値を返さなくて済みます。
    }

    /**
     * 戻り値から複数の値を返す方法。
     */
    private Data returnData()
    {
        // Dataクラスのインスタンスを作り、その中に値をセットします。
        Data data = new Data();
        data.number = 200;
        data.name = "あいうえお";
        // そして、そのインスタンスへの参照を戻り値として返します。
        return data;

        // 同じような事をArrayListやHashMapでもできますが、
        // 絶対にしないようにしましょう。なぜなら、
        // どんな型がセットされているのか、returnData()メソッドの
        // 実装を見なければならないからです。
    }
}

/**
 * 複数のデータを持つクラス。
 */
class Data
{
    // ※フィールドのアクセス修飾子をpublicにしていますが、
    // 皆さんは礼儀正しくprivateにして、
    // getter/setterを作ってください。
    public int number;
    public String name;
}

この単語を含むページ

「みだし」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2010/02/15
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。