noblog!バンコク生活はなぜ良いのか

生のバンコク情報をおとどけ!

ゼロから始めるJava学習 in バンコク その26 Java入門編6 スコープ

もうメシは食ったかの?儂はノブじゃ。

f:id:nobubkk:20180803142726p:plain

儂はいま「paizaラーニング」を利用してJavaの勉強に取り組んでいる。

paizaラーニングJava入門編全10講座中、入門編6まで進めている。

 

 

 

#04:スコープを理解しよう

paiza.jp

まず前回の復習からスタートしよう。

sumメソッドを定義し、mainメソッドの中でsumメソッドを呼び出し出力する。

public static void main(String[ ] args){

int num=sum(20,30);

System.out.println(num);

}

public static int sum(int x, int y){

return x+y;

}

これで、20+30を計算させて、

50

と出力された。

 

これについてはこのような書き方でもよい。

public static void main(String[ ] args){

int a=20;

int b=30;

int num=sum(a, b);

System.out.println(num);

}

public static int sum(int x, int y){

return x+y;

}

 

さて、このようにプログラムが長くなってくると、変数が多くなり変数名を覚えるのも一苦労となってしまう。

しかし、Javaでは変数の有効範囲が決まっているので大丈夫!らしい。

 

あるメソッド定義と別のメソッド定義は完全に独立したコードとして扱われる。

これを変数のスコープと呼ぶ。

 

試しに、sumメソッドの中にも変数aを入れてみよう。

public static void main(String[ ] args){

int a=20;

int b=30;

int num=sum(a, b);

System.out.println(num);

System.out.println("hello"+a);

}

public static int sum(int x, int y){

int a=7;

System.out.println("hello"+a);

return x+y;

}

として実行してみると、

hello7

50

hello20

と出力された。

 

このとき、mainメソッドのa変数とsumメソッドのa変数はスコープが分かれているので独立しているということになる。

このようにブロックの中で定義された変数はすべてローカル変数という。

スコープがあれば、ほかのメソッド定義でどんな名前の変数を使っているのか気にせずにコードを書くことができる。

メソッドをほかのプログラムから呼び出すときにもとても便利で役に立つのだそうだ。

 

なるほど。

とりあえず理解した。

 

#05:RPGの攻撃シーンを作ろう

paiza.jp

 メソッドを使った具体的な例をやってみよう。

 

まずは攻撃対象となる敵を配列で作成し、敵を攻撃するプログラムを作ってみる。

これは今までにやってきた書き方だ。

public static void main(String [ ] args){

String[ ] enemies={"犬","サル","キジ"};

for (String enemy : enemies){

System.out.println("勇者は、"+enemy+"を攻撃した!");

}

}

これで、

勇者は、犬を攻撃した!

勇者は、サルを攻撃した!

勇者は、キジを攻撃した!

と出力された。

 

それでは今回はこの攻撃メッセージの所をメソッドとして分離してみたい。

attackというメソッドを用意してその中で攻撃メッセージを表示する。

public static void main(String [ ] args){

String[ ] enemies={"犬","サル","キジ"};

for (String enemy : enemies){

attack(enemy);

}

}

public static void attack(String target){

System.out.println("勇者は、"+target+"を攻撃した!");

}

これで

勇者は、犬を攻撃した!

勇者は、サルを攻撃した!

勇者は、キジを攻撃した!

と表示された。

 

さて、こうしてメソッドを分離させておけば、メソッド定義だけを修正すれば攻撃シーンを派手にしていくこともできる。

試しにランダムな値に合わせてクリティカルヒットを表示してみよう。

public static void main(String [ ] args){

String[ ] enemies={"犬","サル","キジ"};

for (String enemy : enemies){

attack(enemy);

}

}

public static void attack(String target){

System.out.println("勇者は、"+target+"を攻撃した!");

int hit=(int)(Math.random()*10+1);

if (hit<6){

System.out.println(target+"に"+hit+"のダメージを与えた");

} else {

System.out.println("クリティカルヒット!"+target+"に、100のダメージを与えた");

}

}

これで、

勇者は、犬を攻撃した!

クリティカルヒット!犬に、100のダメージを与えた

勇者は、サルを攻撃した!

サルに5のダメージを与えた

勇者は、キジを攻撃した!

キジに5のダメージを与えた

このように表示された。

もちろん、実行するたびにダメージの大きさ、クリティカルヒットの出る敵は変わっていく。

 

まとめ

メソッドの働きについては理解したと思う。

今勉強しているような短いコードではなく、しっかりとした長いコードを書いているときに、部分的に別に書いてあれば修正や追加が容易であるということだろう。

そもそも一つ一つのコードがうまく書けない儂にとってはそのくらいの理解でとりあえず良いかなと思う。

 

演習問題では部分的な修正のみが問われるので、クリアすることはできるがそれを一から全部書けと言われたら、今の段階ではぜったいムリ。

前はなんとか時間かければできる気がしてたけど、そろそろ無理になってきている。

「ムリムリ」と言ってても仕方がない。

繰り返し練習するしかないね。

 

※有料講座の内容は少し問題等を改変しています。

これからプログラミングの勉強を始めようと思っている方、ぜひ一緒にやっていきましょう。

今宵はここまで。また次を楽しみにしておれ。

 

 

ページを閉じる前に、クリックしてから閉じてね。よろしくお願いします!

にほんブログ村 海外生活ブログ タイ情報へ
にほんブログ村

にほんブログ村 海外生活ブログへ
にほんブログ村