初学者にとって難関の一つメソッドの理解を何回かに分けてやっていく。
メソッドに苦手意識がある人はここを繰り返し学習して苦手意識を克服しよう。
処理の分割(メソッド分割)
まずは以下をコメントを読みながらMethodLesson1.javaを写経する。
public class MethodLesson1 { //ゲームstart時の処理をまとめたメソッド static void gameStart(){ System.out.println("点数を0で初期化"); System.out.println("startボタンを表示"); } //ゲームのメイン処理を書いたメソッド static void gameMain(){ System.out.println("ゲームのメイン処理"); } //ゲーム終了時の処理をまとめたメソッド static void gameEnd(){ System.out.println("スコアをDBに記録"); System.out.println("retryボタンを表示"); } //メインメソッドからそれぞれの処理を呼び出す public static void main(String[] args) { gameStart(); gameMain(); gameEnd(); } }
やってみよう
MethodLesson2.javaを以下のように作成し(コピペで良い)以下の指示通りにプログラムを作成しよう。
●MethodLesson2.java
public class MethodLesson2 { public static void main(String[] args) { System.out.println("★カレーを作るよ★"); System.out.println("材料を揃える"); System.out.println("野菜を切る"); System.out.println("肉を切る"); System.out.println("食材を炒める"); System.out.println("ルーを加え煮込む"); System.out.println("★カレーが出来ました★"); } }
1.static void preCook(){}を作成し、その中に「材料を揃える」、「野菜を切る」、「肉を切る」を移動する。
2.static void mainCook(){}を作成し、その中に 「食材を炒める」「ルーを加え煮込む」を移動する。
3.mainメソッドからpreCook()とmainCook()を呼び出す。
[解答例]
public class MethodLesson2 { public static void main(String[] args) { System.out.println("★カレーを作るよ★"); preCook(); mainCook(); System.out.println("★カレーが出来ました★"); } static void preCook(){ System.out.println("材料を揃える"); System.out.println("野菜を切る"); System.out.println("肉を切る"); } static void mainCook(){ System.out.println("食材を炒める"); System.out.println("ルーを加え煮込む"); } }
今回は処理自体が短いのでメインメソッドだけで処理してしまっても問題ないが、100行を超える処理などは上記のように適切にメソッド分割を行ったほうがよい。
しっかり処理分割をできるようにしよう。
部品の再利用
プログラマーはDRYの原則(Don’t repeat yourself)を大切にしなければならない。
つまり、同じことを二度書いたら「おや?」と思う感覚が大事だ。
その際、その繰り返されている部分をメソッドとして定義してやるとよい。
練習しよう。まずは以下を写経する。
●MethodLesson3.java
public class MethodLesson3 { //*を20個並べて出力し改行する処理 static void printLine(){ for(int i=0;i<20;i++){ System.out.print("*"); } System.out.println(); } public static void main(String[] args) { printLine(); System.out.println("見出し1"); System.out.println("見出し1の内容"); printLine(); System.out.println("見出し2"); System.out.println("見出し2の内容"); printLine(); System.out.println("見出し3"); System.out.println("見出し3の内容"); printLine(); } }
繰り返し登場する処理をメソッドとして切り出し、それを再利用している。
引数
メソッドには引数を設定することができる。
まずは以下を写経
●MethodLesson4.java
public class MethodLesson4 { //String型の引数を一つ受け取りそれの先頭に★を出力するメソッド static void midashiMaker(String title){ System.out.println("★"+title); } public static void main(String[] args) { //メソッドに実引数として"大見出し1"という文字列を渡して実行 midashiMaker("大見出し1"); System.out.println("内容"); midashiMaker("大見出し2"); System.out.println("内容"); midashiMaker("大見出し3"); System.out.println("内容"); } }
引数を利用することで同じメソッドでもちょっと違う処理を実現することができるようになった。
作ってみよう
以下のようにタイトルを引数で渡すと見出しとして装飾してくれるメソッドを作成しよう。
******************** * 大見出し1 ********************
●MethodLesson5.java
1.int型の引数を1つ受け取りその数ぶんだけ*を横並びに出力し、最後に改行するメソッド
static void printLine(int width){
処理
}
を作成する。
2.int型の引数一つとString型の引数を一つ受け取るとそれを上記のフォーマットで出力する。
static void midashiMaker(int width,String title){
処理
}
を作成する。(このメソッドの内部で1で作成したprintLineメソッドを呼び出すこと)
3.mainメソッドに処理を記述し、以下の出力を得よ
******************** * すごい!! ******************** すごいことがありました。 ****************************** * 大事件発生しました! ****************************** 大変なことが起こりました。
解)
public class MethodLesson5 { //引数で受け取った数ぶん*を横に出力し、最後に改行するメソッド static void printLine(int width){ for(int i=0;i<width;i++){ System.out.print("*"); } System.out.println(); } //第二引数で受け取った文字列を装飾するメソッド //装飾の幅は第一引数ぶんとする static void midashiMaker(int width,String title){ printLine(width); System.out.println("* "+title); printLine(width); } public static void main(String[] args) { midashiMaker(20,"すごい!!"); System.out.println("すごいことがありました!"); midashiMaker(30,"大事件発生しました!"); System.out.println("大変なことが起こりました!"); } }
演習)
上記クラスに引数で受け取ったもじ(半角英数限定)を*で取り囲むメソッドを作成せよ。
例)
Hello
を渡すと
******* *Hello* *******
と装飾する。
確認テスト
問)
char型1つとint型1つの引数を受けとり、その文字でその幅分の正方形を描画するメソッド
static void printSquare(char c , int width){
処理
}
を作成し、以下の処理を実現せよ。
[実行例]
一文字入れてください>★
幅を入れてください>5
★★★★★
★★★★★
★★★★★
★★★★★
★★★★★
解)
import java.util.Scanner; public class MethodLesson6 { //第一引数の文字で第二引数の幅の正方形を描画するメソッド static void printSquare(char c , int width){ //外のforは行の制御 for(int i=0;i<width;i++){ //内側のループは列の制御 for(int j=0;j<width;j++){ System.out.print(c); } System.out.println(); } } public static void main(String[] args) { Scanner scan =new Scanner(System.in); System.out.print("一文字入れてください>"); String s=scan.next(); //Stringからcharとして取り出す。 char c=s.charAt(0); System.out.print("幅を入れてください>"); int width=scan.nextInt(); printSquare(c,width); scan.close(); } }
コメント