Java:変数と型
1学習の目的
- 変数に名前を付けてデータを保存できるようになる。数値を直接書く状態から卒業し、読みやすく変更しやすいプログラムが書けるようになる。
- Javaの型を使い分けられるようになる。整数の割り算で小数が消えるという、初心者が必ず躓く挙動を理解する。
2基礎解説
Javaは型を宣言してから使う言語です。「この箱には整数しか入れない」と最初に決めるため、間違った値を入れようとすると実行前にエラーになります。
| 型 | 入るもの | 例 |
|---|---|---|
| int | 整数(約±21億まで) | 128000 |
| double | 小数 | 3.14 |
| boolean | true / false | true |
| String | 文字列 | "ノートPC" |
- 変数は「型 名前 = 値;」の形で宣言する。int price = 128000; のように、型を先に書くのがJavaの特徴。
- ⚠ 整数どうしの割り算は小数が切り捨てられる。7 / 2 は 3 になる(3.5ではない)。小数が必要なら 7.0 / 2 のように片方を小数にする。
- ⚠ double は誤差が出る。0.1 + 0.2 は 0.30000000000000004 になる。金額の計算では要注意で、四捨五入や整数での計算を検討する。
- final を付けると変更できない定数になる。税率のような「途中で変わってほしくない値」に使う。慣習として名前は大文字にする。
- 小数から整数への変換は切り捨て。(int) 3.99 は 3(4ではない)。四捨五入したいなら Math.round を使う。
現場使用例:金額・数量・割引率の管理、フラグ判定、商品名の保持。型を正しく選ぶことが、バグを防ぐ第一歩になる。
public class Main {
public static void main(String[] args) {
// 型 名前 = 値;
int price = 128000;
double rate = 0.1;
boolean isMember = true;
String name = "ノートPC";
// 変数は後から変更できる
price = 150000;
// final を付けると変更できない(定数)
final double TAX_RATE = 0.1;
// TAX_RATE = 0.08; ← エラーになる
// ⚠ 整数どうしの割り算は切り捨て
System.out.println(7 / 2); // 3(3.5ではない)
System.out.println(7.0 / 2); // 3.5
// ⚠ double は誤差が出る
System.out.println(0.1 + 0.2); // 0.30000000000000004
// 小数 → 整数(切り捨て)
int n = (int) 3.99; // 3
// 四捨五入したいなら
long m = Math.round(3.99); // 4
// 文字列 → 数値
int parsed = Integer.parseInt("123");
// var で型を省略できる(Java 10以降)
var count = 42; // int と推論される
}
}
3基本ドリル(10問)
出力 == 128000
int price = 128000; と書く。
public class Main {
public static void main(String[] args) {
int price = 128000;
System.out.println(price);
}
}型 名前 = 値; がJavaの変数宣言の形。型を先に書くのが、PythonやJavaScriptとの大きな違い。
A. 3.5 B. 3 C. 4 D. エラー 選択★☆☆無料
解答 == B
整数どうしの計算結果は整数になる。
B
小数点以下が切り捨てられて3になる。「平均を求めたら値がおかしい」という不具合の多くはこれが原因。
出力 == 128000 / 3.14 / true / ノートPC
+ でつなぐ。区切りは " / " とする。
public class Main {
public static void main(String[] args) {
int price = 128000;
double rate = 3.14;
boolean isMember = true;
String name = "ノートPC";
System.out.println(price + " / " + rate + " / " + isMember + " / " + name);
}
}String だけ大文字始まり。int・double・boolean は基本型と呼ばれ、String はクラス——この違いはJV08で意味を持ってくる。
public class Main {
public static void main(String[] args) {
____ count = 42;
System.out.println(count);
}
}出力 == 42
整数を表す型。小文字で3文字。
int
int は integer(整数)の略。約±21億までの整数を扱える。それを超えるなら long を使う。
A. 4 B. 3 C. 3.99 D. エラー 選択★☆☆無料
解答 == B
小数から整数への変換は切り捨て。
B
四捨五入ではなく切り捨て。4にしたいなら Math.round(3.99) を使う。
出力2行。3 / 3.5
片方を小数にすると、結果も小数になる。
public class Main {
public static void main(String[] args) {
System.out.println(7 / 2);
System.out.println(7.0 / 2);
}
}片方が小数なら、結果も小数になる。変数どうしの割り算では (double) a / b のようにキャストして小数にする。
public class Main {
public static void main(String[] args) {
____ double TAX_RATE = 0.1;
System.out.println(TAX_RATE);
}
}出力 == 0.1
「最終的な」を意味する5文字のキーワード。
final
final を付けると再代入できなくなる。税率や設定値など、途中で変わると困る値に使う。名前は大文字にするのが慣習。
A. 0.3 B. 0.30000000000000004 C. 0 D. エラー 選択★★☆広告解放
解答 == B
コンピュータは小数を正確に表せない。
B
2進数で小数を正確に表せないため誤差が出る。金額計算では四捨五入するか、整数(円単位)で計算するのが安全。
出力 == 256000
Integer.parseInt("128000") で変換できる。
public class Main {
public static void main(String[] args) {
String input = "128000";
int price = Integer.parseInt(input);
System.out.println(price * 2);
}
}文字列のままでは計算できない。フォームやファイルから読んだ値は文字列なので、必ず変換してから使う。
出力 == 42個
var count = 42; のように書くと、型が自動で決まる(Java 10以降)。
public class Main {
public static void main(String[] args) {
var count = 42;
var unit = "個";
System.out.println(count + unit);
}
}var は型を書かなくてよいが、型が無くなるわけではない。代入した値から自動で決まるだけで、後から違う型は入れられない。
4実践シナリオ(5問)
出力 == ノートPC:128000円(在庫5個)セール中
4つの変数を宣言し、+ でつなぐ。boolean はそのまま出力せず、文字で表現する。
public class Main {
public static void main(String[] args) {
String name = "ノートPC";
int price = 128000;
int stock = 5;
boolean onSale = true;
System.out.println(name + ":" + price + "円(在庫" + stock + "個)"
+ (onSale ? "セール中" : "通常価格"));
}
}三項演算子(条件 ? A : B)で表示を切り替えている。boolean をそのまま出力すると true と表示されてしまうので、人が読める言葉に変換する。
出力 == 82.0
合計を double にキャストするか、3.0 で割る。
public class Main {
public static void main(String[] args) {
int a = 80;
int b = 75;
int c = 91;
int total = a + b + c;
double average = total / 3.0;
System.out.println(average);
}
}3.0 で割るのが要点。total / 3 だと整数の割り算になり、82.0 ではなく 82 になってしまう。
出力 == 税込:140800円
Math.round(price * (1 + TAX_RATE)) で計算する。
public class Main {
public static void main(String[] args) {
final double TAX_RATE = 0.1;
int price = 128000;
long taxed = Math.round(price * (1 + TAX_RATE));
System.out.println("税込:" + taxed + "円");
}
}Math.round の戻り値は long 型(int ではない)。税率を定数にしておくと、変更が必要になったとき1箇所直すだけで済む。
出力2行。0.30000000000000004 / 0.3
Math.round(x * 100) / 100.0 で小数第2位に丸められる。
public class Main {
public static void main(String[] args) {
double sum = 0.1 + 0.2;
System.out.println(sum);
System.out.println(Math.round(sum * 100) / 100.0);
}
}100倍して四捨五入し、100.0で割る——小数第2位に丸める定番の手法。最後を 100(整数)にすると整数の割り算になってしまうので 100.0 と書く。
出力 == 小計:25500円
Integer.parseInt で両方を変換してから掛ける。
public class Main {
public static void main(String[] args) {
String qtyInput = "3";
String priceInput = "8500";
int qty = Integer.parseInt(qtyInput);
int price = Integer.parseInt(priceInput);
System.out.println("小計:" + (price * qty) + "円");
}
}変換前と変換後で変数を分けるのが安全。もし変換せずに priceInput * qty と書けば、文字列は掛け算できないのでコンパイルエラーになる——Javaはここで守ってくれる。
5仕上げ課題
宣言する変数
・String shopName:"ゼロカラ商店"
・String itemName:"ノートPC"
・int price:128000
・int qty:2
・boolean isMember:true
・final double TAX_RATE:0.1(定数)
・final double MEMBER_DISCOUNT:0.1(定数)
計算
① 小計 = 単価 × 数量
② 割引額 = 会員なら小計 × 割引率を四捨五入、非会員なら0
③ 割引後 = 小計 - 割引額
④ 消費税 = 割引後 × 税率を四捨五入
⑤ 合計 = 割引後 + 消費税
期待される出力(5行)
=== ゼロカラ商店 ===
ノートPC 128000円 × 2
小計:256000円
会員割引:-25600円
合計:253440円
※ Math.round の戻り値は long 型である点に注意 総合★★★広告解放
出力5行が完全一致
Math.round は long を返すので、割引額や税額は long 型で受ける。割引後 = 256000 - 25600 = 230400、税 = 23040、合計 = 253440。三項演算子で会員かどうかを分岐する。
public class Main {
public static void main(String[] args) {
String shopName = "ゼロカラ商店";
String itemName = "ノートPC";
int price = 128000;
int qty = 2;
boolean isMember = true;
final double TAX_RATE = 0.1;
final double MEMBER_DISCOUNT = 0.1;
int subtotal = price * qty;
long discount = isMember ? Math.round(subtotal * MEMBER_DISCOUNT) : 0;
long afterDiscount = subtotal - discount;
long tax = Math.round(afterDiscount * TAX_RATE);
long total = afterDiscount + tax;
System.out.println("=== " + shopName + " ===");
System.out.println(itemName + " " + price + "円 × " + qty);
System.out.println("小計:" + subtotal + "円");
System.out.println("会員割引:-" + discount + "円");
System.out.println("合計:" + total + "円");
}
}JV01では数値を直接書いていたが、変数を使うと一気に読みやすくなった。単価を変更したければ price の1行を直すだけで、計算式には手を触れなくてよい。これが変数を使う最大の理由だ。
Math.round の戻り値が long である点は、実際に書いてみないと気づきにくい。int discount = Math.round(...) と書くとコンパイルエラーになる——「longをintに入れようとしている」と怒られる。Javaはデータが失われる可能性のある代入を自動では許さないので、こうした場面で必ず止められる。面倒に感じるかもしれないが、これが「実行前に間違いが分かる」ということだ。
final の使い方にも注目してほしい。税率と割引率を定数にしたことで、「この値は途中で変わらない」という意図がコードに刻まれた。もし誰かが誤って TAX_RATE = 0.08; と書き換えようとすれば、その場でエラーになる。
そして三項演算子 isMember ? A : 0。会員かどうかで割引額を切り替えている。if文でも同じことができるが、こうした単純な二択では三項演算子のほうが簡潔になる——次章の条件分岐で、両方の書き方を扱う。
次章では演算と文字列を学ぶ。計算の優先順位や、文字列の操作方法を身につけていく。