Java講座: 型と基本演算
変数と型
Javaは"静的型付け言語"と呼ばれ、変数を宣言する際に「この変数はこんな性質を持っているものです」という情報を明記しなければいけません。
わかりにくいので例を挙げます。Pythonでは変数の宣言は以下のようにして行いました。
x = 1
hoge = 0.1
s = "hello"一方で、Javaでは以下のようにして宣言を行います。
int x = 1;
double hoge = 0.1;
String s = "hello";変数名の前にintやらdoubleやらくっついているのが分かると思います。
これが変数の性質を示す「型」です。
また、上のサンプルコードで行っているのは厳密には宣言ではなく「初期化」と呼びます。 Javaでは変数は以下の形式で宣言します。
変数の型 変数名;基本的な型は以下のとおりです。Stringだけ先頭が大文字であることに注意してください。
| 名前 | 意味 | 備考 |
|---|---|---|
| int | 整数 | -2147483648 ~ 2147483647 まで |
| long | 整数 | -9223372036854775808 ~ 9223372036854775807 まで |
| double | 小数(浮動小数点数) | 誤差あり |
| boolean | ブール値(真偽値) | true or false |
| String | 文字列 | 書くときにはダブルクォーテーション("")で囲む |
| char | 文字 | 書くときにはシングルクォーテーション('')で囲む |
整数は基本的にはint型を使うようにしてください。
宣言した変数には、宣言した型以外の値を入れるとエラーになります。例えば以下のコードはエラーになります。
int x;
x = 0.5; // 整数型のxに小数を代入してしまっているためエラー代入について
プログラミングでは変数に値を入れることを「代入」と呼び、イコール(=)記号を使います。
等号を代入に使うのは気持ちが悪いかもしれませんが慣れてください。
一度宣言した変数には何度でも値を入れ直すことができます。
変数名の規則について
Javaには、変数名の付け方に以下の制限があります。
- 同じ名前の変数は複数宣言できない(
int xと宣言した後にString xと宣言することはできない) - 変数名に使用できるのは半角英数字とアンダーバーのみ
- 大文字と小文字は区別される(
int aとint Aは別物) - 名前の先頭が数字であってはいけない
- 予約語(intやifなど)は使えない この制限を守れているならどんな名前をつけても構いません。
しかし、その変数がどういう役割なのか人目でわかるような命名を心がけましょう。
基本演算
Javaでの四則演算の方法を紹介します。
| 演算子 | 概要 | 用例 |
|---|---|---|
| + | 加算 | 2 + 3 (→ 5) |
| - | 減算 | 5 - 2 (→ 3) |
| * | 乗算 | 2 * 4 (→ 8) |
| / | 除算 | 6 / 3 (→ 2) |
| % | 剰余 (割った余り) | 15 % 4 (→ 3) |
値の更新
もし変数int a = 1と初期化したとして、もとのaに3だけ足して4にしたい場合、どうすればよいでしょうか?
ぶっちゃけa = a + 3と書けばそれでおしまいなのですが、a += 3のように書くことでも同じ結果になります。こっちのほうがスマートですね!
また、「1だけ足したい・減らしたい」場合、それぞれa++、a--と書くことで計算することができます。
1だけ足すことをインクリメント、1だけ引くことをデクリメントといいます。
プログラム例
以下に演算を行うJavaプログラム例を示します。
まずはコピペして実行してみましょう。
そのあと、代入する値や変数名とかを変更して試してみましょう。
public class Main {
public static void main(String[] args) {
int a;
a = 2;
int b = 3;
System.out.println("a + b = " + (a + b));
System.out.println();
System.out.println("b / a = " + (b / a));
System.out.println();
double c = 0.5;
double d = 0.3;
System.out.println("c + d = " + (c + d));
System.out.println();
String e = "Hello, ";
String f = "world!";
System.out.println("e + f = " + (e + f));
}
}このサンプルコードをそのまま実行した場合、おそらくb / aの計算で変な計算結果になったと思います。
これはaとbが整数型であったことが原因です。計算式に整数型が含まれている場合、計算結果も整数型となってしまうのです。
この問題を解決するためには、aとbをともにdouble型とする必要があります。
また、そのように変更してもおそらく完全に正しい値にはなりません。これが浮動小数点数の計算によって生まれる「誤差」です。
余談
ラッパークラスについて
String型だけ先頭が大文字であることに疑問を持った人がいるのではないでしょうか?
実はintやdoubleにも互換性を持つ先頭が大文字の型があります。それらを「ラッパークラス」と呼び、intなどの小文字の型を「基本型」と呼びます。
| ラッパークラス | 対応関係にある基本型 |
|---|---|
| Integer | int |
| Long | long |
| Double | double |
| Boolean | boolean |
| Character | char |
しかし、ラッパークラスは基本型にくらべて目盛の消費量が大きく処理速度も遅くなります。ごく限られた場合を除き、基本的には基本型を使用するようにしましょう。
型変換
Javaでは、「int型として宣言したけど、やっぱこの計算だけはdouble型として使いたい⋯」という場面や、「このString型の文字列、int型として使いたい⋯」といった場面に備えて、型同士の変換方法が用意されています。
型キャスト
変換方法の一つが「型キャスト」と呼ばれるものです。
先ほどb / aの値を精密に計算するための方法として「aとbをどっちもdouble型として宣言する」というものを挙げましたが、実はそれ以外にも方法があります。
以下にやり方を示します。
System.out.println("b / a = " + ((double)b / (double)a));このように変数の前に括弧で変換先の型名を囲うことで、一時的にその変数を変換することができます。int ⇔ double の変換の際は基本的には型キャストで大丈夫です。
文字列の型変換
しかしながら、intやdouble ⇔ String の変換は型キャストではできません。 Java公式から変換するための書き方(メソッドという)が用意されています。
例えば、intやdoubleからStringに変換するにはString.valueOf()メソッドを使います。
int a = 1;
int b = 2;
System.out.println("a + b: " + (a + b)); // 出力は3
System.out.println();
String c = String.valueOf(a);
String d = String.valueOf(b);
System.out.println("c + d: " + (c + d)); // 出力は12逆に、Stringからintやdoubleに変換するためには以下のようなコードを書く必要があります。
String s1 = "1";
int si = Integer.parseInt(s1);
String s2 = "0.5";
double sd = Double.parseDouble(s2);
System.out.println(si + sd); // だいたい1.5になるはず先ほど紹介したラッパークラスが登場していますね。
このように、[変換したい型のラッパークラス].parse[型名](変換元の変数名)という書き方で文字列からの変換が可能です。
正直調べれば出てくる内容のため、今完璧に覚える必要はありません。ただ、「型変換ってのができるんだなあ」ということは覚えておいてください。