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

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

新規登録して質問してみよう
ただいま回答率
85.44%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

5882閲覧

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

tmp0

総合スコア21

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2020/08/13 11:59

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(); } } ```ここに言語を入力 コード

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

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

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

返却するのは処理です。

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

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

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

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

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

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

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

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

例えば、1番のコード

JAVA

1public static int add(int x, int y){ 2 int ans = x + y; 3 return ans; 4} 5public static void main(String[] args){ 6 int ans = add(100,10); 7 System.out.println("100 + 10 = " + ans); 8}

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

一方、2番のコード

JAVA

1 public static void add(){ 2 int x = 100; 3 int y = 10; 4 int ans = (x + y); 5 System.out.println(ans); 6 } 7 public static void main(String[] args){ 8 add(); 9 }

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

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

投稿2020/08/13 13:55

編集2020/08/13 16:11
amiya

総合スコア1218

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

投稿2020/08/13 12:30

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2020/08/13 12:23

clothblue

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

投稿2020/08/13 12:20

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tmp0

2020/08/13 13:01

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問