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道場 | 更新情報をチェックする