アフィリエイト広告を利用しています


スキル無しのシステムインストラクターから、システムエンジニアへの転身日記。
◇◆◇ 2013年取得資格
LPICレベル1
LPICレベル2
LPICレベル3 Core
LPICレベル3 Speciality 302
LPICレベル3 Speciality 303
LPICレベル3 Speciality 304

Cisco CCENT
Cisco CCNA

Java SE 7 Silver
Java SE 7 GOLD

OSS-DB Silver

◇◆◇ 2014年取得資格
HTML5 Professional レベル1

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

JavaEEの前に復習をしてみる その10 オーバーロード

オーバーロードと聞くと、オーバーワークを思い浮かべてしまいます。
そんなのは、私だけ。。。
昨日、メソッドを実行する際に、値を直接もたせて処理させる。
なんてことをさせましたが、Javaにはオーバーロードという考え方がありまして、
もたせる値の型が違えば、同一の名前のメソッドを複数立てても構わないというルールがありました。

え?どういうこと?

薬剤師というクラスがあって、compaundというメソッドを3つ作ります。
通常、同じ名前のメソッドが3つあると、 compaund(); と実行させても、

おい、どのcompaundだよ!どれでもいいのか?いや、そんなことはできない!!
とエラーを返されます。

ですが、下記のプログラムのように、メソッドが持つ引数の中身が違えば、
同じ名前でも、一致する引数のものを動かせばいいと判断できるので、同一でも可能なのです。


package test;

public class Pharmacist {

public static void main (String [] args){
compound( "薬草");
compound( "薬草",3);
compound( "薬草", "毒消草" );
}

public static void compound(String item1){
System. out .println(item1+"を手に取って眺めた" );
}

public static void compound(String item1, int num1){
System. out .println(item1+"を" +num1+"個重ねてすり潰した" );
}
public static void compound(String item1,String item2){
System. out .println(item1+"と" +item2+"を調合して、新たなアイテムを作った" );

}

}



結果

薬草を手に取って眺めた
薬草を3個重ねてすり潰した
薬草と毒消草を調合して、新たなアイテムを作った


これを応用すると、同じメソッドへの命令でも、もたされた値によって動きを変えるということができるようになります。
薬剤師さんも、持っているアイテムや数量によって、処理する結果を変えることができるんですね。

オーバーロードとか、オーバーライドとか、このあたりから、じゃんじゃん出てきますね。
まだまだ入門の入門という感じです。

JavaEEの前に復習をしてみる その9 メソッドを分けてみる。

JavaEEの前に復習をしてみる その6で、Shadeがスイッチ文で行動を分岐しました。
それを一つのメソッドの中に処理を全部書くと、とても見づらいですし、
1つの処理を直すために、全部の処理を書き直す。なんてことになります。
なので、まず、メソッドを分けることについて考えます。

今までだと、1つのクラスの中に、1つのメソッドでしたが、
1つのクラスに4つのメソッドを入れてみます。

mainメソッドと、attackメソッドと、defenceメソッドと、recoveryメソッドです。

package test;

public class Renshu3{
String job = "勇者" ;
static String name = "Shade" ;
static int hitpoint = 10;
static int maxHitpoint = 20;
int at = 5;
static int df = 5;

public static void main (String [] args){
System. out .println( "1.攻撃 / 2.防御 /3.回復" );
int select = new java.util.Scanner(System. in ).nextInt();
switch (select){
case 1:attack( "ゴブリン" );
break ;
case 2:defence();
break ;
case 3:recovery();
default :System.out .println ("なにもしなかった。" );
}
}

public static void attack(String enemyName){
System. out .println(enemyName+ "に攻撃!" );
}

public static void defence(){
System. out .println( name +"は身を守っている。" );
df = df * 2;
}

public static void recovery(){
System. out .println( name +"は、けがの治療に専念した。" );
hitpoint = maxHitpoint ;
}


}



その6ではケースごとに、コンソールへ結果を出力していましたが。
ケースごとに、メソッドを呼び出すことによって、そのメソッドの内部のコードを処理させています。
それぞれ役割が別れているため、コードも見やすいですし、対象メソッドの中身だけ修正すれば、
mainメソッドの中身は変える必要がないのです。

また、
case 1:attack( "ゴブリン" );
メソッドを実行させる際に、値を持たせることができます。

public static void attack(String enemyName){
System. out .println(enemyName+ "に攻撃!" );

メソッド側で、その値を受け取って処理を継続させることもできます。

結果は、下記のように。

1.攻撃 / 2.防御 /3.回復
1
ゴブリンに攻撃!


ここまでの知識で、ある程度のプログラムは組めるような気がしてきますが、
このプログラムはJavaらしさ0です。上司にこのプログラムを見せて、プラグラミングやらせてください!
とか言ったら、お前はインフラにずっといるがよい。フハハハハ!!という魔王並みの発言をされますね。(※ そんな上司はいません)
正直、オブジェクト指向は、あまり得意ではありません。復習と同時に得意にならねばならないな・・・。

JavaEEの前に復習をしてみる その8 2次元配列

勇者さんの道具箱は10個まででも良いとして、
街の商人さんの道具箱は100個くらいは入ってほしいです。
商人さんも、100個入れられる道具箱を作りましょう。

String[] toolbox = new String[100];

できたー!!
でも、この道具箱使いづらくないか?
[薬草|薬草|薬草|薬草|毒消草|毒消草|毒消草|毒消草|毒消草|毒消草|聖水|聖水|薬草|薬草|・・・・・・]
横一列に100個仕切りがあるのです。
凄い横長の店舗を構えなければなりませんし。一つの仕切りが30cmだったとしても、
一番端から端まで30mはあります。

えーと、聖水どこにあったっけ・・・。
あれ、薬草がこんなところにもあった!げ、消費期限きれてる!!
まんげつ草?あったかな、げ、一番端だ!お客様、しばらくお待ちください・・・!!

道具屋さんの道具箱は整理整頓できる棚のようなものがいいですね。
たとえば、10×10のカラーボックスのようなものに、
一番上は薬草、2段目は毒消し草としたらどうでしょう。
先ほどよりは、わかりやすいですね。

では、商人さんのために作っていきます。
前回の応用で、配列を2次元配列に置き換えます。
書き方は結構シンプルで、

String[][] toolbox = new String[10][10];

これだけ。[]が一個増えただけです。

0[0|1|2|3|4|5|6|7|8|9]
1[0|1|2|3|4|5|6|7|8|9]
2[0|1|2|3|4|5|6|7|8|9]
3[0|1|2|3|4|5|6|7|8|9]
4[0|1|2|3|4|5|6|7|8|9]
5[0|1|2|3|4|5|6|7|8|9]
6[0|1|2|3|4|5|6|7|8|9]
7[0|1|2|3|4|5|6|7|8|9]
8[0|1|2|3|4|5|6|7|8|9]
9[0|1|2|3|4|5|6|7|8|9]  商人

こんな大きな棚ができてしまいました。
急に立派になりました。商人さん、上の段まで手が届きませんww

if文を使えばもっとシンプルに書けますが、わかりやすくするため、
それぞれをfor文で処理してみました。

package test;

public class Tools2 {
public static void main (String [] args){
int yakusou = 5;
int dokukeshi = 3;
int seisui = 8;

String[][] toolbox = new String[10][10];

for (int i=0; i < yakusou; i++){
toolbox[0][i] = "薬草" +i+" " ;
}

for (int i=0; i < dokukeshi; i++){
toolbox[1][i] = "毒消草" +i+" " ;
}

for (int i=0; i < seisui; i++){
toolbox[2][i] = "聖水" +i+" " ;
}

for (int i=0; i < toolbox. length; i++){
for (int j=0; j <= 9; j++){
System. out .print(toolbox[i][j]+" " );
}
System. out .println("" );
}
}
}


結果は、

薬草0 薬草1 薬草2 薬草3 薬草4 null null null null null
毒消草0 毒消草1 毒消草2 null null null null null null null
聖水0 聖水1 聖水2 聖水3 聖水4 聖水5 聖水6 聖水7 null null
null null null null null null null null null null
null null null null null null null null null null
null null null null null null null null null null
null null null null null null null null null null
null null null null null null null null null null
null null null null null null null null null null
null null null null null null null null null null


これで整理整頓できました。よく使うものは下の段から入れてよ。
と商人さんから文句を言われたのは言うまでもありません。

JavaEEの前に復習をしてみる その7 配列とfor文

私が、Javaの勉強を始めた時は、何かとRPGの処理に例える。
といった感じで遊びの中で学習していきました。
Java SE Silverの知識をさくっと頭に入れられたのは、
根底にJavaの知識があったからで、資格勉強から始めていたら、
プログラミングは挫折していたでしょう。。。

というわけで、今回は、for文と、配列を使ったプログラム。

道具屋で、薬草を10個買います。
そして、その薬草を道具箱にしまっていく。というイメージ。

String toolbox1 = "薬草0";
String toolbox2 = "薬草1";
String toolbox3 = "薬草2";
String toolbox4 = "役僧3";





とかやっていると、10くらいは頑張れますが、誤字脱字や、
やたらtoolboxが増えて、道具一個しか走らない道具箱10個を抱えて
勇者は冒険に旅立ちます。箱10個引きずった勇者は、かっこよくないですねw

【イメージ図】勇者_[1][1][1][1][1][1][1][1][1][1]

箱を一つにするには、配列という方法ですっきりさせます。

String[] toolbox = new String[10];

上記のように書くことで、文字列型のtoolboxに0から10個の配列を与えます。
一個の箱に、10個入るよう仕切りを付けたような形ですね。
[0|1|2|3|4|5|6|7|8|9]
左から2個目に薬草を入れるのであれば、

toolbox[1] = "薬草";

これでOKです。

よし、10個入る道具箱ができたぞ!
それでは、10個薬草をしまっていくか・・・

toolbox[0] = "薬草";
toolbox[1] = "薬草";
toolbox[2] = "役僧";



ちょっと待った!!変わってないじゃないかww
道具箱にポンっと置いたら自動的に10個並べたい。

そういう時は、for文で処理させましょう。

for (int i=0; i < toolbox. length; i++){
toolbox[i] = "薬草" +i;
}

ここで言う iは、10回処理させるため専用の変数。
toolbox. lengthは、toolbox自体の宣言した値の最大値。
i++は、for文が一回回ったら、iに1ずつ加算される。
これで10回まわります。
そして、for文の中にはtoolbox[i]に薬草+iが代入される処理が含まれているので、
1回for文が回るごとに、toolboxのそれぞれの領域に、薬草がしまわれている。

プログラムは、これだけ。


package test;

public class Tools {
public static void main (String [] args){
String[] toolbox = new String[10];

for (int i=0; i < toolbox. length; i++){
toolbox[i] = "薬草" +i;
System. out .println(toolbox[i]);

}
}
}



結果。
わかりやすくするため、薬草に番号を付けてその場で出力もさせちゃう。

薬草0
薬草1
薬草2
薬草3
薬草4
薬草5
薬草6
薬草7
薬草8
薬草9

これで、ループ文と配列を思い出しました。
まだ、JavaEEにいくには、長いね・・・。

ちなみに、下記がカッコいいと言っているわけではありませんw
【イメージ図】勇者_[0|1|2|3|4|5|6|7|8|9]

JavaEEの前に復習をしてみる その6 キーボード入力とSwitch分岐


今までのコードだと、コードを上から下に流すだけで、
プログラム実行者が操作したりといったことがありませんでした。
せめてキーボードから、何か入力をしたい!

そういうときは、下記を使います。

java.util.Scanner (System. in ).nextInt();

キーボードからの数値を受け付けることができます。
これで、入力された数値に対して、違う動きをさせることが可能です。

合わせてSwitch文を使います。

switch (select){
case 1:System. out.println( "攻撃します。 …誰もいません!" );
break ;
case 2:System. out.println( "防御します。 けど、誰もいません!" );
break ;
case 3:System. out.println ("回復します。 とりあえず、寝ましょうか。" );
break ;
default :System.out .println( "1~3で選んでください。" );
break ;
}

これは、selectという変数の値で、caseに続く値と一致した時に、こういう処理をしなさい。
defaultは、上記に該当しない場合、次の処理をしなさいという意味合いで使っています。

プログラムにしますと、

package test;

/* Rensyu 練習用クラス 
開発者 shade 作成日 1/1 */

public class Rensyu {
public static void main (String [] args){
int hitPoint = new java.util.Random().nextInt(51);
int select ;
String menu = "1.攻撃 / 2.防御 / 3.回復" ;
String name = "Shade" ;
String status= "" ;

if (hitPoint <= 10){
status = "瀕死 " ;
}

System. out .println( "名前:" +status+name);
System. out .println( "HP:" +hitPoint);
System. out .println();
System. out .println(menu);
select = new java.util.Scanner (System. in).nextInt();

switch (select){
case 1:System. out.println ("攻撃します。 …誰もいません!" );
break ;
case 2:System. out.println ("防御します。 けど、誰もいません!" );
break ;
case 3:System. out.println ("回復します。 とりあえず、寝ましょうか。" );
break ;
default :System.out .println ("1~3で選んでください。" );
break ;
}

}
}


結果は1を選ぶと、

名前:瀕死 Shade
HP:2

1.攻撃 / 2.防御 / 3.回復
1
攻撃します。 …誰もいません!

4を選ぶと、

名前:Shade
HP:28

1.攻撃 / 2.防御 / 3.回復
4
1~3で選んでください。

といったようになります。
勿論、正規のプログラムであれば、一つのクラスで処理する内容ではありません。
メニュー用のクラス、キャラクター用のクラスなど処理ごとに分ける必要があります。
これでは、Javaプログラミングではないのです。
とりあえず、コードの書き方に慣れるための練習ということで・・・。

Java SE Silverの試験でも、Switchは出たような。。。

switch (select){
case 1:System. out.println ("攻撃します。 …誰もいません!" );
break ;
case 2:System. out.println ("防御します。 けど、誰もいません!" );
break ;
case 3:System. out.println ("回復します。 とりあえず、寝ましょうか。" );
break ;
default :System.out .println ("1~3で選んでください。" );
break ;
}

たとえば、case3のbreakを書き忘れた場合に、3を選択するとどうでしょう、

回復します。 とりあえず、寝ましょうか。
1~3で選んでください。


上記のように、breakがあるとこまで、次の処理も行ってしまいます。
コードの入力の正確さって大事ですね。

ちなみに、整数以外の文字列が入力された場合は、

名前:Shade
HP:45

1.攻撃 / 2.防御 / 3.回復
あああ
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at test.Rensyu.main( Rensyu.java:22 )


このようにエラーが返されます。これは、selectがint型で宣言されているためです。
回避する方法はあります。ただし、このペースだと、だいぶ先になりそうですw
<< 前へ     >>次へ

先頭に戻る

×

この広告は30日以上新しい記事の更新がないブログに表示されております。