2018年04月06日

師匠のJava道場~第8回・キャストについて学ぶのじゃ!

師匠T:さて、それじゃ行くとしようぞ。弟子よ、心の準備はよいか?

弟子D:すやすや……

師匠T:なんじゃ、居眠りしておるのか。仕方ないのう。

弟子D:ぐぅぐぅ……師匠の老いぼれじじい……。

師匠T:……はぁっ!!(弟子に飛び蹴り

弟子D:うわぁ、師匠、何をなさるんです。

師匠T:やかましい。それでは今月も、Java道場を始めるとするぞ!

▽まず、キャストとはなんぞや?▽

師匠T:さて。今回は、キャストについて話すとするぞ。

弟子D:はい、師匠! さっそくですが、キャストとはなんぞや。

師匠T:うむ。例えば、int型をlong型、float型をdouble型というように、ある値を、別の型に変換することじゃ。このキャストには、二種類ある。プログラマが、プログラム中でコードを書いて自分で行うものと、Javaが勝手に変換してくれるものじゃ。一般的にキャストというと、前者のことを指すことが多い。

弟子D:ふむふむ。それで師匠。キャストはどの型からも、そしてどの型へも、自由にできるのでしょうか?

師匠T:おぉ、それは良い質問じゃな。居眠りしておったからか、頭がいつもよりさえているようじゃの。
 こほん。うむ、自由というわけにはいかぬ。型によって、できるキャストが決められておるのじゃ。次の通り。

・Boolean(ラッパークラス:Boolean)→キャスト不可能
・char(ラッパークラス:Character)→int、long、float、double
・byte(ラッパークラス:Byte)→short、int、long、float、double
・short(ラッパークラス:Short)→int、long、float、double
・int(ラッパークラス:Integer)→long、float、double
・long(ラッパークラス:Long)→float、double
・float(ラッパークラス:Float)→double
・double(ラッパークラス:Double)→キャスト不可能

弟子D:基本的に、上位の型(intならlongというように)へのキャストはできるんですが、下位にはできないんですね。それで師匠、ラッパークラスとはなんぞや?

師匠T:うむ。それは簡単に言ってしまえば、その型をより便利に使うために必要なクラスのことじゃ。例えば、int型のラッパークラスであるIntegerクラスなら、数値を文字列にしてくれるtoStringや、逆に文字列を数値に変換してくれるparseIntなどの、便利なメソッドが用意されておる。

弟子D:なるほど。

師匠T:さて、Javaが自動的にやってくれるキャストについてじゃが、これは変数に代入したり、計算を行うときに、Javaがその結果などを、適切な型に変換してくれる。

弟子D:それは便利ですね。

師匠T:うむ。じゃが、Javaに任せっきりにすると、思わぬエラーが出てくる可能性もあるから、なるべく必要なところでは、自分でキャストを行うのがいいじゃろう。

弟子D:はい、師匠!

▽キャストのやり方じゃ!(その1)▽

師匠T:ではいよいよ、キャストのやり方を伝授するとしようぞ。まずは、intやlongなどの基本型同士のキャストについてじゃ。これは、変数や値などの前に、( )で目的の型を囲んでやればいい。こんな感じじゃな。

(例)
double a = (double)b;

弟子D:ふむふむ。

師匠T:そして次は、数値の基本型(intやlongなど)とString型の変換についてじゃ。これは、先ほどのやり方ではキャストすることはできぬ。

弟子D:String型は、String型のインスタンス……つまり、オブジェクトですから、当たり前といえば当たり前ですね。では、どうするのですか?

師匠T:うむ。まず、String型を、基本型にキャストする場合じゃが、こちらは、目的とする基本型のラッパークラスに備えられておる、parse〇〇〇メソッドを使う。

(例)
int c = Integer.parseInt(d);

師匠T:逆に、基本型をString型にキャストする場合は、Stringクラスに備え付けられているvalueOfメソッドを使う。こんな感じじゃな。

(例)
String e = String.valueOf(f);

弟子D:なるほど!

▽キャストのやり方じゃ!(その2)▽

師匠T:さて、次はboolean型と、String型をキャストする方法じゃ。これも、通常の方法ではキャストすることはできぬ。これの場合も、基本型をString型にキャストするのと同じように、変換先の型のラッパークラスにあるvalueOfメソッドを使って変換する。
 なお、booleanをStringに変換した場合、結果はtrueまたはfalseという文字列になる。

(例)
boolean g = String.valueOf(h);
String i = Boolean.valueOf(j);

師匠T:そして次。intとBigDecimalの変換についてじゃ。

弟子D:あの師匠。BigDecimalとはなんぞや?

師匠T:うむ。これは、変更不可能な、任意の精度の符号付き10進数を扱う特別な型じゃ。オーバーフローしたり、精度を失うことなく、さまざまな計算ができるので、通貨の計算に適しておる。

弟子D:なるほど!

師匠T:それだけでなく、小数点以下の値を丸めるのにも便利じゃぞ。
 さて、基本型からBigDecimalにキャストする場合は、BigDecimalクラスにあるvalueOfメソッドを使って変換する

(例)
BigDecimal k = BigDecimal.valueOf(l);

師匠T:一方、BigDecimal型から基本型に変換する場合は、『変換元であるBigDecimal型変数の』〇〇〇Valueメソッドを使う。

(例)
int m = n.intValue();

師匠T:そして、StringとBigDecimalをそれぞれ変換する場合じゃが、まずはBigDecimalからStringに変換する方法。これは簡単じゃ。変換元変数のtoStringメソッドを使う。

(例)
String o = p.toString();

師匠T:そして、String型からBigDecimalに変換する場合じゃが、これはちと厄介じゃ。引数に、変換元のString型を渡したうえで、BigDecimalのインスタンスを作る必要がある。こんな感じじゃ。

(例)
BigDecimal q = new BigDecimal(r);

弟子D:なるほど、なんとかわかりました、師匠!

▽キャストのやり方じゃ!(その3)▽

師匠T:次は、Object型と基本型との変換についてじゃ。なお、基本型はまたの名を、プリミティブ型と呼ばれることもある。覚えておくがよい。
 さて、Object型というのは、あらゆるクラスの親に当たる。全てのクラスは、スーパークラス(親となるクラス)として、これを持っておる。

弟子D:ふむふむ。

師匠T:さて、基本型は、Object型の変数にそのまま入れることはできぬ。その型のラッパークラスのインスタンスを作り、それをObject型変数に代入する必要がある。

(例)
Object s = new Integer(t);

師匠T:そして、逆にObject型を基本型に変換する場合は、変換先の型のラッパークラスにある、〇〇Valueメソッドを使うのじゃ。

(例)
int u = new Integer(v).intValue();

弟子D:ふむふむ。

師匠T:そしてラスト。Object型とString型についてじゃが、これは変換することなく、そのまま代入することができる。じゃが、Object型をString型の変数に入れる場合は、toStringメソッドで、String型に変換してやる必要があるので注意するのじゃ。

(例)
String aa = bb.toString();
Object cc = dd;

弟子D:String型を、Object型に入れる場合は、そのまま入れればいいんですね。

師匠T:うむ。さて、今回はこれまで。次回は、再びクラスについての話に戻る。クラスの拡張について説明するぞ。復習、予習をしっかりしておくがよい。

弟子D:はい、師匠!

師匠T:ふぅ、さすがに疲れたのう。

弟子D:師匠も、もう歳……

師匠T:はぁっ!!(弟子に飛び蹴り)

※次回の更新は、4月9日。『パソレクのなく頃に』の予定です。お楽しみに!
posted by 裏編 at 09:02| 師匠のJava道場 | 更新情報をチェックする

2018年03月15日

師匠のJava道場~第7回・クラスについて知るのじゃ!(後編)

師匠T:さて、今月も始まったの。師匠のJava道場。
 今回は、アクセス修飾子と、文字列について学び、そしていよいよクラスを実際に作ってみようと思う。
 準備はよいか?

弟子D:はい、師匠!

師匠T:うむ。弟子も燃えておるようじゃの。いいことじゃ。それでは始めるぞ!

▽アクセス修飾子とはなんぞや?▽

師匠T:まずは、アクセス修飾子からじゃ。これは、クラス、メソッド、変数が、他所からアクセスできるかどうかを示したものじゃ。これには、次の四つがある。
・public……どこからでもアクセスできる
・protected……自分のファイルからはどこでもアクセス可能。他所のファイルからは、サブクラスからのみアクセス可能。
・private……自分のいるクラスからのみアクセスできる

師匠T:例えば、sisyoというクラス内に、privateで宣言された変数があった場合、この変数は、sisyoクラスの中からしか、アクセスすることはできぬのじゃ。

弟子D:一方、publicで宣言された場合は、どこからでもアクセスできるというわけですね? ……あれ? 師匠、四つあると言っておきながら、実際には三つしかありませぬが。ははーん、師匠ももうボケ……いてっ。

師匠T:たわけが。わしはまだまだ若い。アクセス修飾子を省略した場合も含むから、四つというわけなのじゃ。アクセス修飾子を省略した場合は、自分のファイルからなら、どこからでもアクセスできる。他のファイルのクラスなどからはアクセスできぬのじゃ。

弟子D:なるほど。それで師匠。protectedのときに述べられているサブクラスとはなんぞや?

師匠T:うむ。それは、あるクラスをもとにして作られたクラスのことじゃ。ちなみに、そのもとになったクラスのことは、スーパークラスという。

弟子D:ふむふむ。

師匠T:このあるクラスを基にして違うクラスを作ること……継承というがの……については、別の機会に説明する。今は、サブクラスは、スーパークラスから作られたクラスであることを覚えておけばよい。

弟子D:ということは、protectedで宣言された場合は、アクセスするクラスが、別ファイルにあるクラスから作られたサブクラスであれば、アクセスできる、ということですね。

師匠T:うむ、その通り。さて、ついでにstaticについても説明しておこう。一般的に、変数やメソッドなどにアクセスするためには、事前にそのクラスを実体化……これをインスタンス化という……させる必要があるが、staticがつけられたクラス、メソッド、変数は、インスタンス化させてなくてもアクセスすることができるのじゃ。

弟子D:おぉっ、それは便利ですね!

師匠T:じゃが、そんな便利そうなstaticにも一つ問題がある。staticで宣言されたメソッドからは、staticでないメソッドをアクセスすることはできぬのじゃ。

弟子D:なるほど……。

師匠T:なお、アクセス修飾子やstaticは、クラス名やメソッド名、変数名の前に、次のようにしてつける。

----------
[アクセス修飾子][static][型]名前
例:
public int a;
private static long b;
----------

師匠T:それと、protectedは、メソッドや変数にしか使うことができぬので、注意すること。

▽文字列の正体とは!?▽

師匠T:さて。いよいよ文字列についてじゃ。

弟子D:はい、師匠! 確か前、「文字列は特別で、変数では扱えない」と言っておられましたが。

師匠T:うむ。それはなぜか、いよいよ語るとしよう。実は文字列は……。

弟子D:ごくり。

師匠T:クラスであり、オブジェクトであるからなのじゃ!!

弟子D:な、なんと!?

師匠T:文字列は、Stringクラスというクラスのインスタンスなのじゃ。そして、この場合、文字列を変数に格納するというのは、実際には、その変数と、文字列……Stringクラスのインスタンスとを結びつける作業なのじゃ。

弟子D:つまり、入れているわけではなく、変数には文字列へのリンクが張られている、と?

師匠T:うむ、そのようなイメージで問題なかろう。それゆえに、この文字列と文字列変数には、いくつか、普通の変数と違う振る舞いや制限があるのじゃ。

弟子D:それはどのような?

師匠T:まず一つ。文字列は変更させることができない。

弟子D:ええええ!? だって、

----------
String s = "abc";
s = "def";
----------

弟子D:ってやったら、ちゃんと動きますよ?

師匠T:うむ。ちゃんと動く。だがそれは、abcという文字列が変わったからというわけではない。

弟子D:???

師匠T:おぬし、さっき言っておったであろうが。変数には何が張られている?

弟子D:あっ! 「文字列のリンク」!

師匠T:その通り。つまり、上の文からすると、書き換えているように見えるが、実際には、defという文字列(実際には、Stringクラスのインスタンス)を新しく作って、変数sからのリンクを、最初のabcという文字列から、新しく作られたdefという文字列に張りなおしているのじゃ。

弟子D:な、なるほど……。

師匠T:話を戻すぞ。そして二つ目。文字列変数は、通常の方法では比較することはできぬ。そのためには、Stringクラスに備わっている、equalsというメソッドを使う必要がある。使い方はこうじゃ。

----------
[文字列変数].equals(比較対象);
例:
s.equals("abc");
----------

師匠T:このメソッドは、文字列変数の中身が比較対象と同じならばtrueを返すぞ。なお、Stringクラスには他にも、文字列を扱うメソッドが色々とある。興味があるなら、Javaについての本やサイトを読むがよい。

弟子D:はい、師匠!

▽クラスを作ろう!▽

師匠T:さて、ではいよいよクラスを作ってみよう。今回は、fireメソッドを実行すると、「BAN!」と表示する、zakuクラスを作ることにする。

弟子D:はいっ!

師匠T:まずはクラス名の宣言からじゃな。どうするかは覚えておるか?

弟子D:え、えーとえーと……。

師匠T:こう書くのじゃぞ。改めて頭に刻みなおすがよい。

----------
[アクセス修飾子]class[クラス名]
----------

弟子D:ということは……

----------
public class Zaku {
----------

弟子D:こうですかね?

師匠T:うむ、その通り。次はコンストラクタじゃな。コンストラクタはこう書くぞ。覚えておるか?

----------
public クラス名(引数)
----------

弟子D:つまり、メソッド名が、クラス名と同じメソッドを作ればいいんですよね?

師匠T:うむ、その通りじゃ。さて、今回は引数はなしでいこう。とすると、こうなるぞ。

----------
public Zaku() {
----------

師匠T:コンストラクタの内容じゃが、"Stand Up!"と表示させることにしよう。ということで、さっきのと合わせて、コンストラクタはこうなる。

----------
public Zaku() {
  System.out.println("Stand Up!");
}
----------

師匠T:さて、次はfire……の前に、セッター、ゲッターのテストとして、弾数を表すint型の変数shotの内容を表示、および設定するゲッター『getShot』とセッター『setShot』も作るとしよう。

弟子D:変数shotは、どこで宣言すればいいんですかね?

師匠T:これまで学んだことと、セッター、ゲッターの意味から考えるのじゃ。セッター、ゲッターはそれを通して、変数の中身を変えるためにある。他方、変数の内容は、クラス内のセッター、ゲッターのどこからでもアクセスできるようにしなくてはならぬ。ということは?

弟子D:あっ! クラス変数として宣言しなくちゃならない、ということですね! ということは、public class Zaku {の下に書くのが正解なのでは? それも、privateとして。

師匠T:うむ、その通り。見事じゃ。その調子で、セッターとゲッターも作ってみるがよい。

弟子D:はい! えーと……こうでしょうか?

---------------------------------------
public int getShot() {
  return shot;
}

public void setShot(int inShot) {
  shot = inShot;
}
---------------------------------------

師匠T:うむ。ゲッター、セッターの両方とも、publicで宣言しておるな。正解じゃ。さて、本題のfireメソッドじゃが、これは簡単じゃな。

---------------------------------------
public void fire() {
  System.out.println("BAN!");
}
---------------------------------------

師匠T:完成したクラスのプログラムがこうじゃ。

-------------------------------------------
public class Zaku {
  private int shot;

    public Zaku() {
      System.out.println("Stand Up!");
    }

    public int getShot() {
      return shot;
    }

    public void setShot(int inShot) {
      shot = inShot;
    }

    public void fire() {
      System.out.println("BAN!");
    }
}
-------------------------------------------

師匠T:今回はここまで。次回は、クラスからいったん離れて、変数を扱ううえで重要なことの一つ、キャストについて説明する。復習、予習をしっかりしておくがよい。


※次の更新は、3月19日、URAURA Game Reviewの予定です。お楽しみに!
posted by 裏編 at 09:12| 師匠のJava道場 | 更新情報をチェックする

2018年02月05日

師匠のJava道場~第6回・クラスについて知るのじゃ!(前編)

弟子D:うむ、一か月ぶりだな! 弟子で……ぐはぁっ!!(師匠に蹴り飛ばされる)

師匠T:たわけが。 前回(第三回)の二番煎じはもういいわ。
さて、今月は、オブジェクトとクラスについて説明していくぞ。準備はいいかの?

弟子D:……

師匠T:おや、気絶したのか?

弟子D:ぐうぐう……Zzz

師匠T:起きんかっ!!(弟子に飛び蹴り

~クラスとはなんぞや?

師匠T:まずオブジェクトとは何かについてじゃが、簡単に言うなら、プログラムを構成する部品のことじゃ。オブジェクトには、そのオブジェクトの特性を表す数値(フィールド)と、それを操作するインタフェース(メソッド)が備え付けられておる。

弟子D:ふむふむ。

師匠T:Javaに限らず、ほとんどのオブジェクト指向のプログラミング言語では、このオブジェクトを中心にしてプログラミングを考え、これを組み合わせることでプログラムを作り上げていくのじゃ。

弟子D:なるほど……。そして、詳しいことを学びたかったら……。

師匠T:専門のサイトや書籍を読むべし。

弟子D:はい、師匠。それでクラスとは?

師匠T:うむ。クラスとは、そのオブジェクトの設計図のようなものじゃ。そして、このクラスをもとにして作られたものをインスタンスと呼ぶ。

弟子D:ふむふむ。

師匠T:ガンダムの世界に例えてみよう。ザクの設計図がクラス、そしてそれをもとに実際に作られたザクがインスタンスじゃ。

弟子D:なるほど、よくわかるたとえですね。

師匠T:では次はインスタンス化についてじゃ。いくぞ!

~インスタンス化じゃ!

師匠T:では、まずはインスタンス化の方法について、説明するとしようぞ。と言っても、難しいことはない。こう書けばいいだけじゃ。

----------
クラス名 インスタンス名 = new クラス名();
例:Zaku CharsZaku = new Zaku();
----------

師匠T:この例だと、Zakuクラスのインスタンス、CharsZakuを作る、というわけじゃ。

弟子D:なるほど。

師匠T:なお、時と場合によっては、()の中に引数が入ることもある。それについては、後で語るとしようぞ。

~クラスとの値のやり取りについてじゃ!

師匠T:さて。インスタンスと値のやりとりをする方法じゃが、それには、セッター、ゲッターを使う。

弟子D:セッター? ゲッター?

師匠T:セッターとは、インスタンスのフィールドの値を設定するためのメソッド。ゲッターとは、フィールドの値を取得するためのメソッドじゃ。いわば、これはインスタンスの門番のようなものじゃな。
Javaでは、このようにセッターとゲッターを通してやり取りするのが一般的じゃ。

弟子D:なぜ、そのようなことをするのですか?

師匠T:フィールドの値を、異常な値に書き換えられたことを考えてみるがよい。そのせいで異常な動作をするようになっては一大事。じゃが、セッターやゲッター内で、異常な値のやり取りを通さないようにチェックするようにすれば、その心配はなくなるじゃろう。

弟子D:なるほど。

師匠T:このように、フィールドを直接操作できないようにして、セッターやゲッターを通して値のやり取りを行い、フィールドを守ることをカプセル化という。覚えておくがよい。

~コンストラクタじゃ!

師匠T:さて、次はコンストラクタじゃ。これは、クラスがインスタンス化されたときに、最初に実行されるメソッドじゃ。
そのインスタンスの初期状態を設定するのが主な役割じゃな。

弟子D:ふむふむ。それで、コンストラクタはどう書くのでしょうか?

師匠T:うむ。これも難しいことはない。そのクラス名と同じ名前のメソッドを書けばいいだけじゃ。なお、タイプはpublicで書くこと。

----------
public クラス名()
例:public class1()
----------

師匠T:また、引数を必要とする場合は、このかっこの中に書いておくこと。その場合は、インスタンス化のときにも引数を必要とするぞ。

----------
public class class2 {
public class2(int p1) {
……
}
}

class2 ins1 = new class2(5);
----------

師匠T:なお、コンストラクタも他のメソッドと同じく、オーバーライドすることができる。引数を必要としない場合と、引数を必要とする場合の、両方の呼び出し方がある場合は、これを使うこともあるじゃろう。オーバーライドについては覚えておるか?

弟子D:なんでしたっけ?

師匠T:はぁっ!!(弟子に飛び蹴り)さて、今月はここまで。次回も今回の続き。次回は、アクセス修飾子と、文字列について学び、そして試しにクラスを作ってみようと思う。復習を忘れずにな。

※次の更新は、2月8日。『師匠TのチャレンジARSゲーム!』の予定です。お楽しみに!
posted by 裏編 at 10:23| 師匠のJava道場 | 更新情報をチェックする

2018年01月22日

師匠のJava道場~第5回・配列について学ぶのじゃ!

弟子D:やぁ、みんな! 一か月ぶりだな! 弟子Dだ! 今回は、師匠のクソジジイが交通事故にあって、くたば……ぐはぁっ!!(蹴りで吹き飛ばされる)

師匠T:勝手に殺すな。 それに、誰がクソジジイじゃと?

弟子D:い、いえ、なんでもありません。なんでもありませんとも。い、いったい誰が、師匠のことをクソジジイだの暴力おやじだの、とっととくたばってしまえだのなんて……。

師匠T:おぬしが言ったんじゃろうがっ!(弟子を殴る)まぁよい。今回は、配列について説明する。覚悟はよいか?

弟子D:は、はい……。

▽配列の準備じゃ!▽

師匠T:さて、配列とは何かについては、これまで、あちこちのプログラミング講座で嫌というほど説明されているから、深く説明することはあるまい。

弟子D:はい。一つの変数を複数の部屋に区切ったようなものですよね。確か、それぞれの部屋は、添え字というもので識別したと思います。

師匠T:うむ、その通りじゃ。図にすると、こんな感じじゃな。

java180101.gif

師匠T:さて、ではJavaで配列を使う方法について説明するぞ。まず、宣言についてじゃが、このように書く。

-------------------------
変数の型[] 配列名;
-------------------------

師匠T:例えば、int型の配列sisyoを作る場合は、このように書く。

-------------------------
int[] sisyo;
-------------------------

弟子D:Javaでは添え字を囲むかっこは、丸かっこではなく、角かっこを使うんですね。

師匠T:うむ。だが、まだそれだけではない。次の文を書いてはじめて、配列を使えるようになるのだ。

-------------------------------
配列名 = new 変数の型[要素数];
-------------------------------

弟子D:ふむ。要素数というのは、配列の中の部屋の数ですよね。

師匠T:うむ、その通りじゃ。

弟子D:ということは、先ほどの配列sisyoの場合には……

-------------------------------
sisyo = new int[6];
-------------------------------

弟子D:と、このように書くということですか?

師匠T:見事、その通りじゃ。なお、この文じゃが、先の宣言はあくまで配列を用意しただけ。その配列に、実際に値などを格納する場所を確保するがこの文というわけじゃ。配列を使うには、この二つの文をセットで使う必要があるので注意するがよい。

弟子D:はい、師匠!

師匠T:なお、宣言と確保の文をまとめて、このように書くこともできるぞ。

-------------------------------------------
変数の型 配列名[] = new 変数の型[要素数];

例:
int deshi[] = new int[5];
-------------------------------------------

▽配列の使い方じゃ!▽

師匠T:さて、準備ときたら次は使い方じゃが、さほど難しいことはない。添え字を囲むかっこが角かっこであることを除けば、他のプログラミング言語と同じじゃ。

-------------------------------------------
配列名[添え字]
例:
sisyo[0]=50;
↑配列sisyoの0番に、50を代入する
kotae=sisyo[1]+sisyo[2];
↑変数kotaeに、配列sisyoの1番の値と、配列sisyoの2番の値を足した答えを入れる
-------------------------------------------

弟子D:添え字に変数を使えるというのも、他のプログラミング言語と同じですよね?

師匠T:うむ。さて、ここまで扱ってきたのは一次元配列じゃったが、他の言語と同じように、Javaでも二次元以上の多次元配列を扱うことができる。その場合の宣言文は次のように書くぞ。

-------------------------------------------
変数の型 配列名[][]……;

例:
int sisyo[][];
-------------------------------------------

弟子D:配列の次元の数だけ、[]を続けて書くわけですね。

師匠T:その通り。そして、場所を確保する場合には、このように書く。

-------------------------------------------
配列名 = new 変数の型[要素数][要素数]……;

例:
sisyo = new int[3][2];
-------------------------------------------

師匠T:実は、他のバリエーションもあるが、ちとややこしいのでこの形式を覚えておけば問題はあるまい。さて、余談のその2じゃ。配列の要素数を知りたいときには、lengthを使う。書き方はこうじゃ。

-------------------------------------------
配列名.length;
-------------------------------------------

師匠T:多次元配列で使う場合には、配列名の後ろに、調べたい行や列を[]つきで書く。次のようにの。

-------------------------------------------
例:
sisyo[2].length;
deshi[1][3].length;
-------------------------------------------

弟子D:なるほど、わかりました、師匠。

師匠T:うむ。次回はいよいよ、Javaの肝の一つ、オブジェクトとクラスについて説明する。文字列についても扱う予定じゃ。気合を入れるように。

※次の更新は、1月25日、PCメディア情報の予定です。お楽しみに!
posted by 裏編 at 10:15| 師匠のJava道場 | 更新情報をチェックする

2017年12月14日

師匠のJava道場~第4回・繰り返しの命令!forとwhileじゃ!

師匠T:はああああ! 見よ、B-Magaはっ!

弟子D:赤く萌えているぅぅぅぅぅ!!

師匠T:ふぅ、いい汗をかいたのう、弟子よ。さて、今回のJava道場は繰り返しの命令について説明していくぞ。

弟子D:おぉっ!

師匠T:それでは、いくとするぞ!!

▽まずはfor文じゃ!▽

師匠T:まずは、for文から説明していくとするぞ。これはこのように書く。

===============================================================
for (カウンタ変数の初期化;ループの継続条件;カウンタ変数の変化)
例:for (int i=0;i<10;i++) {

}
===============================================================

師匠T:まずは、カウンタ変数の初期化から説明していくぞ。これは、継続条件となる変数に最初の値を入れるところじゃ。書き方は、通常の変数の代入と同じじゃ。例でいえば、変数iに0を入れておるわけじゃな。

弟子D:ふむふむ。

師匠T:なお、例ではintが頭についておるが、既に変数が宣言されておる場合は、別につける必要はない。

弟子D:なるほど、わかりました。

師匠T:では次、ループの継続条件じゃ。こちらは、条件を書くのじゃが、for文は、この条件が満たされている間、{と}の間の処理を繰り返すのじゃ。

弟子D:ということは……。

師匠T:うむ。条件が成立しなくなったら、繰り返しから抜けるというわけじゃな。上の例でいえば、iが10未満の間、繰り返す。つまり、iが10以上になったらループを終えるわけじゃ。

弟子D:なるほど。そしてカウンタ変数の変化はそのまま、ループの最後まで行ったときに、変数の値を変える処理を書くわけですね?

師匠T:……。

弟子D:ど、どうされましたか?

師匠T:まさか、おぬしがそれをわかるとは……。誰じゃ、弟子の脳をいじくった者は!?

弟子D:……。

師匠T:こほん。おぬしの言うとおりじゃ。例でいえば、ループの最後まで行ったあと、変数のiの値に1を足すわけじゃ。

弟子D:なるほど……あれ?1を足すのなら、i=i+1なのでは?

師匠T:おぉ、それを説明し忘れておったの。++はインクリメント演算子と言って、左辺の変数に1を足して、その値をそのままその変数に入れる、という処理をする演算子なのじゃ。これに似たものとして、1を引いて入れるデクリメント演算子というのもあるぞ。こちらは--じゃ。

弟子D:なるほど。

師匠T:なお、for文のこれらの記述は全て省略してこのように書いてやることも可能じゃ。

===================
for (;;) {

}
===================

弟子D:こうするとどうなるのですか?

師匠T:うむ。終了条件も何もないので、ループを永遠に繰り返すことになるぞ。

弟子D:うわ、それはとても困るのでは。

師匠T:心配はいらぬ。breakを入れれば、そこでループから抜ける。これを、条件分岐と組み合わせてやればよいのじゃ。

弟子D:なるほど。終了条件を満たしたときに、break文を実行するように、if文を書けばいいわけですね。こんな風に。

===================
for (;;) {
  if (i>10) {
    break;
  }
}
===================

師匠T:うむ、その通りじゃ。では次に進むぞ。

▽while文じゃ!▽

師匠T:さて、次はwhile文じゃ。これも、forと似ており、条件式が成立している間、{ と } の間の処理を繰り返す、というものじゃ。このように書くぞ。

===================
while (条件式) {

}
===================

師匠T:また、これと似たようなもので、do~whileというものもある。

===================
do {

} while(条件式)
===================

弟子D:この二つはどう違うのですか?

師匠T:条件式が成立している間繰り返すというのは、先のwhileと同じじゃ。ただ、このdo~whileの場合は、条件が成立していなくても、最低一回だけ繰り返す、というところが違うのじゃ。

弟子D:なるほど。うまく使い分けることが肝要ですね。

師匠T:そうじゃな。

▽breakとcontinueについて▽

師匠T:最後に、breakともう一つ、continueについて教えておこう。breakについてはわかっておるな。

弟子D:はいっ!……えーと、なんでしたっけ?

師匠T:たわけがっ!!(飛び蹴り)

弟子D:うわぁっ。

師匠T:おぬしの頭は容量が1KBしかないのか。breakを実行すると、そこでループを終了し、} の次の命令に処理を移すのじゃ。

弟子D:な、なるほど。それではcontinueは?

師匠T:うむ。こちらは、実行されると、そこでループの先頭に戻って次の繰り返しを始めるのじゃ。図にするとこうなるぞ。

java171213-01.jpg
▲ break

java171213-02.jpg
▲ continue

弟子D:なるほど。こちらも使い分けることが肝要ですね。

師匠T:うむ、その通りじゃ。さて、次回は、繰り返しと組み合わせて使うと強力な配列について説明するぞ。復讐をしっかりとやっておくがよい。

弟子D:あの、師匠。ふくしゅうの字が違います。

師匠T:気にするな。



※次回の更新は12月18日、URA URA GAME REVIEW!の予定です。お楽しみに!
posted by 裏編 at 09:31| 師匠のJava道場 | 更新情報をチェックする