Javaを最初に勉強する時、ほとんどの人は次のような「Hello World」プログラムから始めたのではないでしょうか?
public static void main( String[] args )
{
System.out.println( "Hello World" );
}
メソッドの戻り値に指定されているvoidの意味などは、最初は気にしていなかったかもしれませんが、Javaを学習する上でvoidの理解は必須です。
この記事では、Javaのvoidについての解説や、メソッドの定義方法などについて解説していきます。
voidとは?
Javaでメソッドを定義するときは、メソッド名・引数・戻り値の3つを指定して宣言をします。この時、メソッドの戻り値の型にvoidを指定すると、そのメソッドは値を返さないメソッドとして定義されます。
voidとは「何もない」という意味で、Javaではメソッドの戻り値のみに指定できる特別な型として存在します。戻り値がvoidとして宣言されたメソッドは、return時には何も値をかえしません。(逆にreturn時に値を戻すとコンパイルエラーとなる)
戻り値がないメソッド(voidメソッド)
このように、voidは戻り値がないメソッドで指定する特別な型です。戻り値がvoidで宣言されたメソッドは、メソッド内で必要な処理を行い、戻り値を変えささずにメソッドを抜けるのが基本的な実装です。
public void voidMethod() {
System.out.println("戻り値がないvoidメソッド");
}
returnキーワードでメソッドを抜けることも可能で、その時はreturnのみを指定し、戻り値は指定しません。この時にreturnには戻り値は指定しません。
public void voidMethod() {
System.out.println("戻り値がないvoidメソッド");
return;
}
voidで戻り値がないメソッドとして宣言されている場合は、returnで戻り値を返す処理を書いてしまうとコンパイル時にエラーとなります。
public void voidMethod() {
System.out.println("戻り値がないvoidメソッド");
return 123; //error: incompatible types: unexpected return value
}
voidメソッドの呼び出し
先述したように、voidは戻り値がないメソッドであるため、voidメソッドを呼び出す場合は、次のサンプルコードのように戻り値の変数を指定せず、メソッドの呼び出しを行います。
public class Main {
public static void main(String[] args) {
//voidメソッドの呼び出し
voidMethod(1, 2);
//戻り値があるメソッドは、戻り値を受け取る変数を指定する
int result = intReturnMethod(1, 2);
}
// voidメソッド
public static void voidMethod(int args1, int args2) {
System.out.printf("voidメソッド args1=%d, args2=%d", args1, args2);
}
// intの値を返すメソッド
public static void intReturnMethod(int args1, int args2) {
return args1 + args2;
}
}
void以外のメソッド(戻り値があるメソッド)
戻り値がないvoidメソッドの作り方について解説してきましたが、今度は、戻り値があるメソッドの定義方法を見ていきましょう。
戻り値があるメソッドは、次の構文の通り、メソッド名の前に戻り値の型を指定します。
public 戻り値の型 myMethod(引数) {
//メソッド内の処理
}
実際にいくつか戻りの宣言を行ったメソッドを作ってみましょう。
次のサンプルコードはintの値を返すメソッドです。戻り値の型をintに指定し、メソッド内のreturnでintの値を戻します。
public int intMethod() {
return 100; // 100を呼び出し元の処理に返す
}
戻り値の型を指定しるにもかかわらず、メソッド内の処理でreturnで値を戻していない場合は、コンパイル時にエラーになります。
public int intMethod() {
System.out.println("intMethodメソッドの処理");
//returnで値を返さずにメソッド内の処理を終了
}
コンパイル結果
-------------------
Main.java: error: missing return statement
分岐がある時のreturn時の注意点
戻り値が定義されたメソッドで、処理内部にifなどの分岐がある場合、すべての条件分岐で値をreturnする必要があります。もし、一部の分岐だけ値を返すreturnが抜けている場合、returnを指定しなかった時と同じコンパイルエラーが発生します。
次のサンプルコードは、引数で渡されたscoreの値を点数ごとに評価した文字列を返すメソッドです。scoreの値が50点以上の場合はreturnで結果を返していますが、50点未満の場合はどの分岐にも入らず値が戻されなくなるため、このコードはコンパイルエラーになります。
public String evaluation(int score) {
if (score == 100) {
return "満点です";
} else if (score >= 70) {
return "よくできました";
} else if (score >= 50) {
return "あと一歩";
}
}
コンパイル結果
-------------------
Main.java: error: missing return statement
コンパイルエラーにならないためには、どの条件分岐を辿ったとしても値が戻されるようにコードを修正する必要があります。
public String evaluation(int score) {
if (score == 100) {
return "満点です";
} else if (score >= 70) {
return "よくできました";
} else if (score >= 50) {
return "あと一歩";
}
return "もっと頑張りましょう";
}
まとめ
javaのvoidは、戻り値がないメソッドを表す特別な型であることや、戻り値があるメソッドの定義方法や注意点について解説してきました。
voidは、Javaのみならず、C++やC#などの言語でも使用されるキーワードで、基本的にはJavaと同じような用途で使用するため是非voidキーワードについて理解を深めておきましょう。
- voidは戻り値がないメソッドを宣言するときに、戻り値の型として指定する
- voidで定義されたメソッドで戻り値を返そうとするとコンパイルエラーになる
- intやStringなどの戻り値があるメソッドは、メソッド内で必ず戻り値を返す必要がある
リストで記述すると上記のように表示されます。