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

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

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

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

Q&A

解決済

4回答

7280閲覧

【Java】returnとvoidの関係と、returnの意味

t.z

総合スコア21

Java

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

0グッド

2クリップ

投稿2020/02/29 14:04

質問したいこと

returnやvoidを書くか書かないかの判断が難しいので、できるようになりたい。

returnとvoidの関係性とは

returnなしならvoidを書くという認識でいい・・・といった記事がたくさんあると思います。
ゆえに、4つのパターンが浮かびます。

  1. void型ではなく、returnあり
  2. void型であり、returnはない
  3. voidもreturnもある
  4. voidもreturnもない

そうやって見ていくと例としては(偶然かもしれませんがいくつか見つかったもの)

  1. getter(データ取得)に多い。
  2. setter(データ設定・更新)に多い。initメソッド。実引数を渡す処理が書かれたメソッド。仮引数なし関数。
  3. 関数内のif文{}の中にreturnあり
  4. コンストラクタ

「returnなしならvoidを書くという認識でいい」というのは1,2のことですが、3,4も見つかります。

私なりに分析すると

  1. Stringやintという戻り値の型を決める必要があるのでvoidとは書けない。
  2. ただreturnがないのでvoid型。
  3. {}で囲まれているからvoid型の中にreturnが存在できる。ただそのブロックの処理を抜ける処理。
  4. 仮引数で型が定義されていたり、多様な型を扱うため。

具体的な疑問点

  • まず、上の項目で間違っている点はあるのかと、1~4の具体的な例は他にあるかは気になります。

  • よく、関数から値を返すのがreturnとありますが、「返す」とはなんでしょうか。println()処理やsetText()のような処理で引数に"hoge"を渡したらhogeと「返ってくる」という意味とはなぜ違うのですか。

  • getterとsetterのちがいもよくわかりませんが、getterとsetterというざっくりとした傾向が見られるということは1か2かの判断も具体的にできるはずと予想しています。

  • Stringやintだからvoid型ではないのような判断ではなく、returnなしならvoid型だという判断のほうがよく見かける理由はなんなのでしょうか。そもそも戻り値の型はどのように決まっているのでしょうか。リファレンスなんかを見ると型が書かれていますが、複雑化したものに戻り値の型がなぜつけられるのか、なぜ型変換という概念があるのかもわかりません。

今回の質問の目的は、returnやvoidを書くか書かないかの判断方法がわかればとりあえず達成です。別質問した方がいいものはまた調べるなり質問を書くなりします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

思考の順番がまるっきり逆です。
メソッドというのは、何かをするためにあるものです。
getterであれば情報を取得(get)するために、setterであれば情報を設定(set)するために、
またあるメソッドは何かを探すために、またあるメソッドは情報を削除するために。

その「何か」をするために情報が必要ならそれを引数として渡し、必要なものは結果を返して終了します。
「結果を返す」とは、例えば「何かを探す」メソッドであれば、それが「どこにあったか、あるいはなかったか」、あるいは「見つかったものが何か」を表す情報を「返し」ます。いわば「仕事の報告」です。そういう結果が必要な仕事であれば返り値がvoid以外になりますし、当然returnが必要です。

一方、何らかの事務処理のようなものであれば、特に処理結果なども必要としない場合も多いでしょう。そういった場合はvoidになります。

voidでreturnが使われるときというのは、「もう処理する必要がなくなった」場合です。

投稿2020/02/29 15:56

swordone

総合スコア20669

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

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

t.z

2020/03/03 03:20

私が理解できていなかった原因の矛盾はまさにこれかもしれません。 繰り返し読む価値のあるアンサーありがとうございます。
guest

0

returnやvoidを書くか書かないかの判断方法がわかれば

の質問自体が無意味です。

関数(メソッド)について、今までに学んだと思っていることをすべて忘れて、定評のある入門書でやり直したほうがいいと思います。


「返す」とはなんでしょうか。

数学を思い出しましょう。
f(x) = x+3という関数があったとすると、f(1)4を返します。
これが、「返す」の意味です。

println()処理やsetText()のような処理で引数に"hoge"を渡したらhogeと「返ってくる」という意味とはなぜ違うのですか。

それは、「表示される」だけで、「返ってくる」とは全然違います。

投稿2020/02/29 14:33

otn

総合スコア85901

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

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

t.z

2020/03/03 03:19

ご回答ありがとうございます。 難しく考えすぎていたかもしれません。 数学の関数のお話で、「返す」の使われ方に納得しました。 基礎の基礎から見直したいと思います。
guest

0

私も強いプログラムを書ける訳ではないのですが。

メソッドを使うにあたって呼び出し側に処理された結果を戻してそれを元に呼び出し側で何かをしたい場合にvoid以外を指定します。
メソッドで何かを行うだけでよい場合はvoidとします。

returnは、return 〇〇と単にreturnを見てみれば良いのではないでしょうか?
void以外の戻り値を必要とする場合にはreturn 〇〇とあります。
voidの場合は、returnのみとなってると思います。
なぜ、voidの場合にreturnがあるのかは、if文などで条件分岐をしその内容によってはもうそのメソッドは終了し呼出し側へ処理を戻したい場合に使う感じではないですか?
その様なパターンが無い場合にはvoidでreturnは必要ないのだと思います。

返すとはなんでしょうか

メソッドを呼んだ呼出し元へreturn 〇〇で返す事で戻り値です。

呼出し側の受け取る変数 = 呼出しメソッド(引数があれば引数);

java

1int kekka = 0; 2kekka = 100;

kekka = 100;100がメソッドに置き換わるkekka = method();だけです。

ただし、methodの戻り値や受け取る変数ここではkekkaは同じ型でなければなりません。

投稿2020/03/01 03:03

shinami

総合スコア334

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

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

t.z

2020/03/03 03:33

頭の中で図式を思い描くことができて、理解に一歩近づきました。 ご回答いただいたように考えると、今まで学んできたことのつじつまがあうような気がします。 ありがとうございます!
guest

0

そんなに強いプログラマーではありませんが、自分の認識を共有させていただきます。
※一度編集途中で誤投稿してしまいました。すいません。

パターン1, 2

voidは、メソッドの戻り値が無いことを表し、
メソッドの仕様として、戻り値を返す場合には、voidではなく、返す戻り値の型を記述する必要があります。
そういう仕様です。

returnなしならvoid型だという判断のほうがよく見かける理由

は、
メソッドにreturnと記述がないということは、
そのメソッドでは戻り値が必要ない
つまり、メソッドの戻り値の部分に記述すべきはvoidだ!
という流れで、そのような書き方になったのかな?と考えます。

しかし、そもそも戻り値は先に決めておくものだと思いますし、メソッドの内容を書いてから、return文が無いからvoidだな!としてしまうのではなく、
こんな処理をするメソッドが欲しい=>処理の結果を戻り値として取得するのに適切な型はこれだ!
という流れでメソッドの戻り値を決めるのが普通かな?と思います。
その結果として、戻り値が必要ない場合に、voidになるのです。

パターン3

戻り値がvoid以外のメソッド内では、

return 〇〇;

のような記述をしますが、戻り値がvoidのメソッド内でreturn文が記述されているとき、

return;

という記述になっていると思います。
これは、何も返していない(無(void)を戻り値にしている)ということです。たぶん。
何も返さないのに、何でreturnと書くんだ!と思いませんか?はじめは自分もそう思いました。
なぜこのような記述をするのかというと、returnには戻り値を返すはたらきの他に、メソッドの処理を終了するというはたらきがあるためです。
これにより、場合によって以降の処理が不要になる場合、以降の処理をせずに値を返す、といったようなことが可能になります。
これを利用して、

java

1//漢字とひらがなの対応付け 2private String[][] data = { 3 { 4 "法華", 5 "冨賀", 6 "秘誉" 7 }, 8 { 9 "ほげ", 10 "ふが", 11 "ぴよ", 12 } 13}; 14 15//該当する漢字があった場合、それに対応したひらがなの値を返す 16public String getKana(String val){ 17 //漢字を順番に見ていく 18 for(int i = 0; i < data[0].length; i++){ 19 //valと同じなら 20 if(data[0][i].equals(val)) 21 return data[1][i];//対応するひらがなを返す 22 } 23 return null; 24}

のようなことができます。

また、returnの直後に何らかの処理をさせようとしても、メソッドの処理は終了しているため、無意味な記述だとしてコンパイルエラーを起こします。たぶん。

つまり、

java

1public void printHogeHoge(){ 2 System.out.println("hoge"); 3 System.out.println("hoge"); 4 return; 5}

は大丈夫でも、

java

1public void printHogeHoge(){ 2 System.out.println("hoge"); 3 return; 4 System.out.println("hoge"); 5}

はダメです。仮に実行できたとしても、二度目のhogeが出力できません。returnでメソッドの処理が終わっているからです。
ちなみに、戻り値が無い場合でも、
return;
とすればreturn文は使用できます。

また、以下の場合では、returnがメソッドの途中にあっても許されます。

java

1//strを出力する。 2public void printStr(String str){ 3 //nullなら何もしない 4 if(str == null){ 5 return; 6 } 7 //strを出力 8 System.out.println(str); 9}

なぜ許されるかというと、strがnullでないときは普通にstrが出力されますし、if文のブロック内ではreturn文以降に処理を書いていないからです。

パターン4

コンストラクタを、voidもreturnも無いメソッドだと認識しているようですが、あれはクラスのインスタンス作成時に呼ばれる特別なメソッドで、戻り値部分の記述が存在しないのは仕様です。
なぜ戻り値部分の記述ができないのかというと、おそらく、インスタンスを作るメソッドなので、戻り値を定義する必要性が無いからだと思います。

また、return文を内部で使うことはできます。
ですが、ほとんどの場合、コンストラクタでそこまで複雑な処理をする必要が無く、引数のメンバ変数への代入などだけで済ませるため、あまり内部でreturn文を見ることはないのだと思います。

###よく、関数から値を返すのがreturnとありますが、「返す」とはなんでしょうか。println()処理やsetText()のような処理で引数に"hoge"を渡したらhogeと「返ってくる」という意味とはなぜ違うのですか。

あれは、値が返ってきているのではなく、出力されているだけです。
値が返されている場合、メソッドの戻り値の型はvoidではなく、メソッド内でreturn 〇〇; のように値が返されており、また、

java

1int i = Integer.parseInt(256);

のように、値を取得できます。setText()やprintln()ではこれができません。これらのメソッドでは、目に見える形に表示する処理を内部で行っていますが、戻り値はありません。

投稿2020/02/29 16:05

編集2020/02/29 16:18
KojimaYuuki

総合スコア24

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

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

t.z

2020/03/03 03:29

たしかに、voidのメソッド内ではreturn;かもしれないし、納得しました。 Java言語全体とのつながりが見えたので、次の課題も見えました。 素敵なご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問