メソッド
メソッド②
voidメソッド
以前、記号文字 ‘*’ を並べて直角三角形を表示するプログラムを作成したのを覚えているでしょうか?これを、メソッドを用いてプログラムを改良しましょう。
//IsoscelesTriangleLB.java
//左下が直角の直角三角形を表示
import java.util.Scanner;
public class IsoscelesTriangleLB {
static void putStars(int n){
while(n-- > 0)
System.out.print('*');
}
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
System.out.println("直角三角形を表示");
System.out.print("段数は:");
int n = stdIn.nextInt();
for(int i = 1; i <= n; i++){
putStars(i);
System.out.println();
}
stdIn.close();
}
}
メソッドputStarsは、n個の ‘*’ を連続して表示します。表示をするだけで返却する値はありません。そのため、このようなメソッドの返却型を void と宣言します。voidメソッドでは、値を返さないため、return文は必要ではありません。
メソッドの汎用性
次に、右下側が直角である直角三角形を表示するプログラムを作りましょう。
//IsoscelesTriangleRB.java
//右下が直角の直角三角形を表示
import java.util.Scanner;
public class IsoscelesTriangleRB {
static void putChars(char c, int n){
while(n-- > 0)
System.out.print(c);
}
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
System.out.println("直角三角形を表示");
System.out.print("段数は:");
int n = stdIn.nextInt();
for(int i = 1; i <= n; i++){
putChars(' ', n - i);
putChars('+', i);
System.out.println();
}
stdIn.close();
}
}
今回のプログラムで新しく定義したのが、putCharsというメソッドです。このメソッドは、仮引数cに与えられた文字を連続してn個表示します。任意の文字を表示できるという点でより汎用性が高くなっています。
他のメソッドの呼び出し
ここまでのプログラムでは、mainメソッドの中から標準ライブラリメソッドや自作のメソッドを呼び出していました。自作のメソッド内でもメソッドを呼び出せます。そのような例を以下に示します。
//SquareRectangle.java
//長方形と正方形を表示
import java.util.Scanner;
public class SquareRectangle {
//文字cをn個表示
static void putChars(char c, int n){
while(n-- > 0)
System.out.print(c);
}
//文字'+'を並べ正方形を表示
static void putSquare(int n){
for(int i = 1; i <= n; i++){
putChars('+', n);
System.out.println();
}
}
//文字'*'を並べ高さhで幅wの長方形を表示
static void putRectangle(int h, int w){
for(int i = 1; i <= h; i++){
putChars('*', w);
System.out.println();
}
}
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
System.out.print("正方形を表示");
System.out.print("一辺は:"); int n = stdIn.nextInt();
putSquare(n);
System.out.print("長方形を表示");
System.out.print("高さは:"); int h = stdIn.nextInt();
System.out.print("横幅は:"); int w = stdIn.nextInt();
putRectangle(h, w);
stdIn.close();
}
}
メソッドputCharsは、前のプログラムと同じですが、正方形と長方形を表示するメソッド内で呼び出されています。
有効範囲
変数はメソッドの中だけでなく、外で宣言することもできます。その例を以下に示します。変数xの値が異なる場所で宣言されていますが、これらの識別子の通用する有効範囲(scope)が異なります。
//Scope.java
//識別子の有効範囲を確認
public class Scope {
static int x = 700;
//クラス有効範囲:フィールド
static void printX(){
System.out.println("x = " + x);
}
public static void main(String[] args){
System.out.println("x = " + x);
int x = 800;
//ブロック有効範囲:局所変数
System.out.println("x = " + x);
System.out.println("Scope.x = " + Scope.x);
printX();
}
}
クラス有効範囲(class scope)
メソッドの外で宣言されている変数の識別子は、そのクラス全体に通用します。メソッドの外で宣言される変数はフィールド(field)と呼ばれ、メソッドの内で宣言された変数とは区別されます。
ブロック有効範囲
ブロック内部で宣言された変数は局所変数(local variable)呼ばれます。局所変数の識別子は、宣言された直後からそのブロックの終端である } まで適用されます。
引数を受け取らないメソッド
次のプログラムは、暗算力のトレーニングを行うものです。3桁の数の和を求めます。誤った数値は受け付けず、正解するまで続きます。
//MentalArithmetic.java
//暗算力トレーニング
import java.util.Random;
import java.util.Scanner;
public class MentalArithmetic {
static Scanner stdIn = new Scanner(System.in);
static boolean confirmRetry(){
int cont;
do{
System.out.print("もう一度?<Yes…1/No…0>");
cont = stdIn.nextInt();
}while(cont != 0 && cont != 1);
return cont == 1;
}
public static void main(String[] args){
Random rand = new Random();
System.out.println("暗算力トレーニング");
do{
int x = rand.nextInt(900) + 100;
int y = rand.nextInt(900) + 100;
int z = rand.nextInt(900) + 100;
while(true){
System.out.print(x + " + " + y + " + " + z + " = ");
int k = stdIn.nextInt();
if(k == x + y + z)
break;
System.out.println("違いますよ");
}
}while(confirmRetry());
}
}
mainメソッドでは、3つの乱数x、y、zを生成した上で問題として提示します。キーボードから読み込んだ値がkが、3つの和と等しければ正解です。不正解である限り、while文が繰り返されるので終わることが出来ません。confirmRetryは、もう一度トレーニングするかの確認を行います。キーボードから入力された1か0の値でtrueかfalseを返します。