質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.05%

java 戻り値の必要性と理解について

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 786

score 21

javaの戻り値の必要性について以前どなたかが質問していたのですが、私の抱える疑問とはレベルが違ったので改めてレベルの低い私にも理解できるようアドバイスいただければ幸いです。

次のコード①のように戻り値の型がint型のaddで中身は(int x,int y)の2つの引数が入るというのは理解できます。
疑問①
コード①のようにmainメソッドでaddメソッドを呼び出すし後に、その値を返すというのが理解できません。返すというの返却するということでしょうか。
疑問②なぜ、返す必要があるのでしょうか。mainメソッドが中心となって動いていくのに、返却しなくても良くない?といった理解です。
私としてはコード②でいいじゃんと思ってしまいます。クラスで処理書いて、mainで呼ぶだけにしとけば楽なのに、return文を入れることによって文法も変わってくるしなんか理解に落とし込めてないといった状況です。
これはオブジェクト思考を学んでいく上で重要になって来るのでしょうか。
ひねくれ者の私にお力添えをいただければ幸いです。

コード①
public class Main{
 public static int add(int x, int y){
  int ans = x + y;
  return ans;
}
public static void main(String[] args){
 int ans = add(100,10);
 System.out.println("100 + 10 = " + ans);
}
コード②
public class Main {
  public static void add(){
    int x = 100;
    int y = 10;
    int ans = (x + y);
    System.out.println(ans);
  }
  public static void main(String[] args){
    add();
  }
}

ここに言語を入力
コード
```

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+3

コード①はaddに足したい好きな値を渡せば答えを返してくれるから使いましが出来るけど、コード②はaddを使っても100+10しか出来ないから使いにくいという感じだと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

「返す」というのは、メソッドの処理結果として、何らかの値(今回ですと整数値)を呼び出し元に渡すということです。今回の例(2つの値の加算)は簡単すぎるので、メソッド内でもっと複雑な処理をする想定で考えてください。

呼び出し元では、返された値を使ってさまざまな処理を行なうことができます。その場で出力するだけではなく、それを基に別の計算を行なうとか、値をファイルに書き込むとか、ネットワーク経由で接続した相手に値を送信するとか、……どのように使うかは、もはや値を返したメソッドには関係ありません。

いっぽう、コード2の方法では、「得られた値をその場でコンソールに出力する」以外の使い方はできません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+2

コード①のようにmainメソッドでaddメソッドを呼び出すし後に、その値を返すというのが理解できません。返すというの返却するということでしょうか。

『返す(return)』の本来の意味は、値を返すのが主題ではありません。
第一に返すものは『処理進行の権限』です。
メソッドの呼び出しを受けると、処理のポイントがそのメソッドへとジャンプします。
つまり、処理がメソッドへと移ります。
その中でreturnに出会うか、メソッドが最後まで進むと、処理のポイントを呼び出し元の位置へとジャンプさせます。
つまり、処理を元の位置へと返します

返却するのは処理です。

戻り値がある場合はついでにそこに添えて一緒に渡します。

メソッドは呼び出されて処理を受け取るものなので、処理は必ず返さなければ、おかしなことになってしまいます。
(大昔のBASICとかでは、まともに返さずあちこちに飛び回るいわゆるスパゲティコードなんてものがたくさん生まれて悲劇を生みました)

疑問②なぜ、返す必要があるのでしょうか。mainメソッドが中心となって動いていくのに、返却しなくても良くない?といった理解です。

では、なぜ値を返す必要があるのか?
というのは、これは考え方が逆なのです。
値を返さなくてはいけない、のではなく、値を返してほしいとあなたが望んだときに、返すようにするのです。
値を返すか返さないかは、設計の問題であり、そのメソッドにどんな機能を望むのか?という問題です。

『渡した数を足してその値を画面に表示する』という機能のメソッドであれば、返す必要はありません。

『渡した数を足してその値を呼び出し元に返す』という機能のメソッドであれば、返す必要があります。

自分がほしいのはどちらなのか?で、返すかどうかを決めればよいのです。

決め方の指針の1つとして、『機能の粒度は細かい方が使い出がある』というのがあります。
ボタン一つで何から何まで全自動でやってくれる機械があればたしかに便利ですが、
その代わり全自動なのでその用途にしか使えません。
機能別に別れている機械であれば、繋ぎ変えることで、機能を組み替えることができます。
別の用途にも使い回せたりします。
(それも、何方にするかは設計の考え方次第ではありますが。)

例えば、1番のコード

public static int add(int x, int y){
  int ans = x + y;
  return ans;
}
public static void main(String[] args){
 int ans = add(100,10);
 System.out.println("100 + 10 = " + ans);
}


こちらはaddメソッドの機能は『与えられた数値を足す』だけです。
今回はそのままmainメソッドの中でprintlnでコンソールに表示していますが、
その答えを、GUIのウィンドウに表示することもできますし、ネットで対戦相手に送ることも可能です。

一方、2番のコード

  public static void add(){
    int x = 100;
    int y = 10;
    int ans = (x + y);
    System.out.println(ans);
  }
  public static void main(String[] args){
    add();
  }


こちらは、addの機能は『決まった数値を足す。そしてコンソールに表示する』という二つの機能を持っています。
こちらはこれで完結していますので、決まった値を結果をコンソールに表示したい時にしか使うことができません。
足した数値をコンソール以外の場所に表示したいとおもったり、対戦相手に送信したいと思ったら、
このaddメソッドは使えませんので、別の加算単体のメソッドを作るか、
加算してGUIに表示するメソッド加算して対戦相手に送信するメソッドと、たくさんのメソッドを作らないとなりません。
複数の機能を持つメソッドを基準にすると組み合わせの数だけ膨大なメソッドを作らないといけなくなります。

1番のような、加算するだけのメソッドであれば、それにGUIに表示するメソッド対戦相手に送信するメソッドを組み合わせれば、様々な機能を実現できて、使い出があるのです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

コード②の方法では、そもそも add()メソッドも不要、main()だけで十分。

まあ、この程度のコードでは、どう書いても大差ないです。
ある程度、コードの量が増えた時、どうするか?
機能毎にメソッド分割します。
ここで、add()という機能に分割する時、addという名称から、連想するのは加算です。従って、加算(add)以外の機能を持たせるべきでは無いという考えです。
従って、加算する値の設定、結果の出力(System.out.println())はメソッドの外に置くべきでしょう。add()メソッドは、複数の入力値を加算する機能を持つ事になります。
で、加算した結果は、戻り値として呼び出し側に返す事になります。
戻り値云々より、機能の分割(メソッド)が先に来ます。

こんな事でよいでょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/13 22:01

    ありがとうございます。理解できたように思います。なんとなくですが、コンストラクタと同じような役割ではと思ったのですが、違いはありますか?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る