┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃.&&&& **** %%%%.  JavaScript&Javaで目指そう!基本情報技術者試験  ┃ ┃&&&&&&******%%%%%%  執筆&編集 斎藤末広 suehiro@he.mirai.ne.jp  ┃ ┃'&┃&''*┃*''%┃%'  発行    江口昌宏 ***  ┃ ┗━┻━━┻━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 広告募集:http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓  第12号 2002/01/xx  型変換 ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛  プログラムを作成する上での注意事項:  Windows とIE を前提としています。  拡張子を表示するに設定してください。 ------------------------------------------------------------------------ ニュース  JDK の最新版が,公開されています。  Java2 SDK Ver1.3.1_02 44.5 MByte http://java.sun.com/j2se/1.3/ja/download-windows.html  Ver1.3.0_02 (Jマガ2号のころ)は,29.6 MByte でした。多くの API が 増えているのが察しられます。 ------------------------------------------------------------------------ ▼ 自動型変換と明示的型変換  変数は型によって分類されています。型の枠を超えての計算はできません。型 が合わないときは,型変換を行います。  また,別の号で扱いますが,子クラスのインスタンスを親クラスのインスタン スとして扱うときも広い意味で型変換です。  型変換は,自動的で行えるときと,特定の操作を必要とするときがあります。 JavaScript は,実行時に必要に応じて,自動的に型変換をします。Javaは,代入 時と代入以外の演算時に自動的にする場合と,意図的に型変換をする必要がある 場合があります。  この号では,整数,実数(浮動小数),文字列の間での型変換を説明します。 ------------------------------------------------------------------------ ▼ JavaScript は自動型変換,意図的に変換させることもできる  JavaScriptは,型は必要に応じて,実行中に自動的に変換します。意図した型 変換をしたいときは,特別に指示をします。  数値を文字列として扱いたいとき  a = "" + 12  のように,""に数値を加えると,強制的に文字列となります。なお,これは,  Java でも使用できるテクニックです。  文字列を数値として扱いたいとき  eval関数かparse関数を使用します。eval は,evaluate の省略で,財産等を 金銭的に評価するという英語です。parse関数は,parseIntのように後ろに型名 がつきます。parse は,構文解析するという意味の英語です。文字列に含まれて いる数値を認識するという感じです。eval と parse の違いは,eval の方は, 文字列が," 1 + 2 " のときに,計算もしてくれるという点です。画面から, 入力された文字列を数値に変換する場合は,eval が向いていると言えます。 オーバヘッドから考えると,スピードは,parse の高速と思われます。 例 j12-01.htm 数値と文字列の変換 サンプル j12-01.htm


------------------------------------------------------------------------ ▼ 整数同士の型変換  ここからは,Java の型変換についてです。  整数系の型を確認しておきます。  整数系の型 ------------------------------  型名  バイト数  値の範囲 ==============================  byte 1 -128 から 127  short 2 -32768 から 32767  char 2 0 から 65535  int 4 -(2の31乗) から (2の31乗 -1)  long 8 -(2の63乗) から (2の63乗 -1) ---------------------  このうち,int 型よりも小さい型,すなわち,byte, short, char は,代入以 外の演算時に自動的に int 型になり,演算が実行されます。long 型が混在した 場合は,long 型との演算時に long 型になります。  代入のみの式の場合は,代入先が大きいバイト数の整数の型であれば,自動的 にその型に変換されて代入されます。ただし,byte, short から,char に代入す るときは,符号分の処理ができないため,自動では変換されまん。意図的に変換 をする必要があります。 byte xb = 3; xb = -xb;  は,コンパイルエラーになります。-xb で,xb の符号が反転する時点で,int 型になります,xb への代入段階で,int を byte に入れようとするので,コンパ イルエラーとなります。  小さいバイト数の型に変換したい場合は,キャストという機能を利用します。 符号は自動的に判断されます。キャストは,演劇の配役の「配る」の意味です。 キャストは下の書式のようになります。x の値を y に向かって投げ入れるような 意味合いです。  y = (yの型名)x; byte xb = 3; xb = -xb; は, byte xb = 3; xb = (byte)(-xb); とすることで,無事に xb に -3 を入れることできます。 例 j12-02 xIntTran.java public class xIntTran { public static void main(String[] args) { // 型変換:整数系同士 byte xb; short xh; int xi; long xl; xb = -1; xh = xb; //代入時自動変換 byte型からshort型 System.out.println(xh); xi = -12; xb = (byte)xi; // キャスト int型からbyte型 System.out.println(xb); xi = xb + xh; // 混在演算 int型に統一 System.out.println(xi); xl=123L; xl = xl + xi + xb + xh; // 混在演算 long型に統一 System.out.println(xl); } } ------------------------------------------------------------------------ ▼ 浮動小数点同士の型変換  こちらも,整数系の型と同様です。短精度浮動小数点型から倍精度浮動小数点 型への変換は自動で,倍精度から短精度へは,キャストを利用します。  混在したなかに,倍精度があれば,倍精度に自動的に変換,混在した中に,倍 精度がなく,短精度と整数なら,自動的に短精度となります。 例 j12-03 xFloatTran public class xFloatTran { public static void main(String[] args) { // 型変換:浮動小数点系同士 float xf; double xd; xf= 0.5f; xd = xf; // 短精度から倍精度へ代入時自動変換 System.out.println(xd); xd = xd/2.0; xf = (float)xd; // 倍精度から短精度へ,キャスト System.out.println(xf); xd = xf + xd * 2 + 3; // 短精度,倍精度,整数混在時は,自動的に倍精度 System.out.println(xd); xf = xf * 3; // 短精度と整数混在は,自動的に短精度 System.out.println(xf); } } ------------------------------------------------------------------------ ▼ 整数型と浮動小数点型  整数から浮動小数点へは,自動でできます。しかし,浮動小数点から整数への 変換は,キャストを利用する方法と,小数部分の取り扱いを正確に表現するとい うことで特別に,ceil(天井)関数,floor(床)関数を使用します。  celi は,天井という意味で,floor は,床という意味です。数直線を縦にした 場合の,床(マイナス無限大方向)と天井(プラス無限大方向) をイメージ して下さい。なお,ceil と floor は,倍精度浮動小数点型を返しますので,整 数として利用するには,さらに(int) キャストと併用する必要があります。 例 j12-04 xFtoITran.java public class xFtoITran { // 型変換:整数型と浮動小数点型 public static void main(String[] args) { int xi,yi,zi,wi; double xd,yd,zd,wd; System.out.println("整数から浮動小数点への変換"); xi = -3; xd = xi; // 代入時に自動変換(整数→倍精度,短精度も同様に可能) System.out.println(xd); System.out.println("-------------------------------"); System.out.println("浮動小数点から整数への変換"); System.out.println("-------------------------------"); System.out.println("1.25 -1.25 1.75 -1.75"); xd = 1.25; yd = -1.25; zd = 1.75; wd = -1.75; System.out.println("----------------------- int キャストを利用"); xi = (int)xd; yi = (int)yd; zi = (int)zd; wi = (int)wd; System.out.print(xi);System.out.print("\t"); System.out.print(yi);System.out.print("\t"); System.out.print(zi);System.out.print("\t"); System.out.print(wi);System.out.print("\t"); System.out.println(""); System.out.println("----------------------- Math.round を利用"); // Math.round(double) は,長整数型を返すため,intにキャストしている xi = (int)Math.round(xd); yi = (int)Math.round(yd); zi = (int)Math.round(zd); wi = (int)Math.round(wd); System.out.print(xi);System.out.print("\t"); System.out.print(yi);System.out.print("\t"); System.out.print(zi);System.out.print("\t"); System.out.print(wi);System.out.print("\t"); System.out.println(""); System.out.println("----------------------- Math.floor を利用"); // Math.floor は,double 型を返すため,intにキャストしている xi = (int)Math.floor(xd); yi = (int)Math.floor(yd); zi = (int)Math.floor(zd); wi = (int)Math.floor(wd); System.out.print(xi);System.out.print("\t"); System.out.print(yi);System.out.print("\t"); System.out.print(zi);System.out.print("\t"); System.out.print(wi);System.out.print("\t"); System.out.println(""); System.out.println("----------------------- Math.ceil を利用"); // Math.ceil は,double 型を返すため,intにキャストしている xi = (int)Math.ceil(xd); yi = (int)Math.ceil(yd); zi = (int)Math.ceil(zd); wi = (int)Math.ceil(wd); System.out.print(xi);System.out.print("\t"); System.out.print(yi);System.out.print("\t"); System.out.print(zi);System.out.print("\t"); System.out.print(wi);System.out.print("\t"); System.out.println(""); } } 補足 ラッパークラスを利用して整数型と浮動小数点型と変換することも可能 ------------------------------------------------------------------------ ▼ 文字列型と数値型の変換  コンピュータ内部では,"12" と 12 とは違うものとして扱っています。"12" + "34"を計算すると,"1234"となり,12 + 34 は,46 となります。"12" と書かれ たときは,文字として,1 と 2 をみています。12 と書かれたときは,10 進数 の 12 を意味しています。  文字列としての "12" を数値としての 12 とみなす,また逆に,12 を,文字列 の "12" と扱うときに型変換を必要とします。 ------------------------------------------------------------------------ ▼ 数値と文字列の変換 自動と明示 数値から文字列へ  演算時に文字列があれば,数値から文字列に自動的に変換されます。  s = "" + 12; // s には,文字列の"12"が代入されます。  また,Stirng クラスにある,valueOf 関数を利用して,明示的に数値を文字列 に変換することができます。 文字列から数値へ  文字列を数値に変換するのは,簡単にはできません。基本データ型に対応した 特殊なクラスであるラッパークラスを利用します。基本データ型をラップでくる んで,クラスにした感じですので,ラッパークラスと呼ばれています。  ラッパークラスは,つづりが大文字で始まっているので,基本型と区別ができ ます。char 型に対応して,ラッパークラスCharacter や,int クラスに対応した Integerクラスは,フルスペルになっています。  基本型 ラッパークラス boolean Boolean byte Byte short Short char Character int Integer long Long float Float double Double  整数型を例にすると,int に対応して,ラッパークラス Integer がり,その メソッド(関数)を利用して,次のように変換できます。  整数型→文字列型 Integer.toString(整数型)  文字列型→整数型 Integer.parseInt(文字列型) 例 j12-05 xStringTran.java public class xStringTran { // 型変換:数値型と文字列型,双方向 public static void main(String[] args) { String xs; int xi; // 数値型から文字列型へ xi = -1; xs = "" + xi; // 文字列を含む演算時に自動的に整数を文字列に System.out.println(xs); xs = String.valueOf(xi); // valueOfで明示的に変換 System.out.println(xs); xs = Integer.toString(xi); // ラッパークラスIntegerのメソッド利用 System.out.println(xs); xs = Integer.toHexString(xi); // 符号なし16進表示 System.out.println(xs); System.out.println(""); // 文字列型から数値型へ xs = "-5"; xi = Integer.parseInt(xs); // ラッパークラスIntegerのメソッド利用 System.out.println(xs); xi = Integer.valueOf(xs).intValue(); // ラッパークラスIntegerのメソッド利用 System.out.println(xs); } } ----------------------------------------------------------------------- ▼ 型変換のまとめ  今回は,数値型同士,数値型と文字列型の型変換を扱いました。整数の値を \100,000 のように表示したり,0034 のように先行0付で表示するような扱い も事務系のプログラムでは必須の機能でしょう。また別の号にそれは譲ります。  感想は,斎藤まで,suehiro@he.mirai.ne.jp  広告等のお問い合わせ:*** ------------------------------------------------------------------------ ▼ 次号の予定  関数からメソッド  感想は,斎藤まで,suehiro@he.mirai.ne.jp  広告等のお問い合わせ:*** ------------------------------------------------------------------------ ▼ 誤字・脱字等の修正,プログラムの修正など,以下の場所で確認できます。 過去の修正版等  http://www.mirai.ne.jp/~suehiro/java/jmaga/ 登録・解除および広告の案内  http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ------------------------------------------------------------------------ ▼ 著作権について  このメールマガジンで公開しているプログラムソースは,著作権を当方スタッ フが所有しますが,商用を含めて,再利用,改変,発表を制限しません。  本文に関しては,斎藤末広が著作権を所有します。再利用に関しては,承諾を 必要とします。 広告募集 http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ------------------------------------------------------------------------ ▼アンケート(以下を返信してください)  この号のJマガは役立ったあるいは勉強になりましたか? 該当するものだけ残してください。 5: 大いに,YES 4: YES 3: 普通 2: NO 1: 大いに,NO その他