1. なぜ型の変換が必要なのか?
Java は厳密に型付けされた言語です。もしコンピューターに数値用の「箱」があるのに、そこへテキストを押し込もうとしたら——それはちょうど USB ポートにフォークを差し込もうとするようなものです。コンパイラはそんなことを許してくれません! 😡
しかし現実には、異なるデータ型を同時に扱うことがよくあります。たとえば、数値を含む文字列を持っている場合です。そこで必要になるのが型の変換(あるいは型のキャスト)です。
例を見てみましょう。たとえば、ユーザー数を保持したいとします:
int a = 1;
int b = "2";
int c = "三";
コンパイラはすぐにこう言います: 「私を何だと思っているの? 文字列を数値に自動変換なんてできません。あなたが明示的に変換してください」。
Java にはいくつかの変換方法があり、それぞれに長所・短所やありがちな落とし穴があります。
2. int を String に変換する
業務では、数値の文字列表現が必要になる場面がよくあります。たとえば、画面に表示したり、ファイルへ保存したり、ネットワークで送ったり、テキストと結合したりするときです。Java にはそのための方法が複数あり、状況に応じて使い分けられます。
String.valueOf() メソッド
これは基本かつ最も一般的な方法です:
int number = 42;
String str = String.valueOf(number); // str == "42"
String.valueOf() は、渡されたオブジェクトの型に応じた文字列表現に変換します。
空文字列との連結
昔からあるが有効な方法です:
int number = 42;
String str = "" + number;
単純なケースでは手早く書けますが、コードを読む側には意図がやや不明瞭になります。
3. 暗黙の文字列変換
前述のとおり、Java では、あらゆる変数・オブジェクト・式を String 型に変換できます。
さらに、String 型と他の型を連結すると、自動的に文字列化が行われます。例:
int a = 5;
String name = "Anya" + a; // name は文字列 Anya5 を保持する
int a = 5;
String city = a + "New York" + a; // city は文字列 5New York5 を保持する
int number = 10;
String code = "Yo";
String message = "Hello! " + number + code; // message は文字列 Hello! 10Yo を保持する
これら3つの例では、int と String を問題なく連結しており、結果は常に String 型になります。
例:
int a = 5;
String name = "1" + a; // name は文字列 15 を保持する
int a = 5;
String city = a + "9" + a; // city は文字列 595 を保持する
int number = 10;
String code = "10";
String message = "" + number + code; // message は文字列 1010 を保持する
連結は左から右へ評価されるため、結果がやや予想外になることがあります。例:
int a = 5;
String name = a + a + "1" + a; // name は文字列 1015 を保持する
評価の順序: ((a + a) + "1") + a
4. 文字列を数値に変換する
Java で数値を文字列に変換するには、空文字列と連結するだけで十分です:
String str = "" + chislo;
では、文字列を数値に変換するにはどうすればよいでしょうか。もちろん、どんな文字列でも数値に変換できるわけではありません。しかし、文字列が数字だけで構成されているなら可能です。そのために Java には専用のメソッドがあります。
使い方は次のとおりです:
int x = Integer.parseInt(stroka);
ここで、int x は整数変数 x の宣言、stroka は文字列として与えられた数値(数字だけで構成された文字列)です。
例:
String str = "123";
int number1 = Integer.parseInt(str); // number1 は数値 123 を保持する
int number2 = Integer.parseInt("321"); // number2 は数値 321 を保持する
int number3 = Integer.parseInt("321" + 0); // number3 は数値 3210 を保持する
int number4 = "321"; // コンパイルされません: 変数は int 型、値は String 型
負の値でも動作します。Integer.parseInt() はとても賢いメソッドです。
GO TO FULL VERSION