「変数って聞いたことあるけど、なんのためにあるの?」「Javaって型がたくさんあってよくわからない…」そんなふうに感じたことはありませんか?
プログラミングを始めたばかりのころ、変数の概念でつまずく人はとても多いです。でも安心してください。変数は一度しっかり理解してしまえば、どんなプログラムを書くときにも必ず役に立つ「土台」になります。
この記事では、IT研修の現場で初学者に繰り返し伝えてきた視点をもとに、「なぜ変数が必要なのか」から「Javaでの具体的な使い方」「現場で気をつけたいポイント」まで、ていねいに解説していきます。コードの例もたっぷり入れているので、ぜひ手を動かしながら読み進めてみてください!
目次
1.なぜ変数は必要なの?
①「データを一時的に覚えておく箱」が必要な理由
プログラムは、何かを「計算」したり「判断」したりするためのものです。その過程で、途中の値を一時的にどこかに保存しておく必要があります。それが「変数」の役割です。
たとえば、消費税を計算するプログラムを考えてみましょう。税率が8%から10%に変わったとき、変数を使っていれば1か所直すだけで済みます。でも変数を使わずに数値を直接書いていたら…すべての箇所を探して修正しなければなりません。
// ❌ 変数を使わない場合(修正が大変)
System.out.println(1000 * 0.10);
System.out.println(2000 * 0.10);
System.out.println(3000 * 0.10);
// ✅ 変数を使う場合(税率を1か所変えるだけでOK)
double taxRate = 0.10;
System.out.println(1000 * taxRate);
System.out.println(2000 * taxRate);
System.out.println(3000 * taxRate);
変数があることで、コードの変更に強くなり、読みやすくなる。これが変数が必要な一番の理由です。
②変数は「メモリ上のある領域に名前をつけたもの」
少しだけコンピュータの仕組みに踏み込んでみましょう。プログラムが動くとき、データはコンピュータのメモリ(RAM)上に乗ります。メモリはものすごく大量の「番地」(アドレス)に区切られた空間です。
でも、番地をそのまま使うのは大変ですよね。「0x00FF12AB番地の値を使え」なんて言われても人間には辛い。そこで登場するのが変数名です。「この番地の領域を score と呼ぼう」と名前をつけることで、人間がわかりやすくデータを扱えるようになります。
イメージとしては、ロッカーに名前シールを貼るようなもの。中身(データ)は変わっても、ロッカーの名前(変数名)は変わらない。だから次に使うときも同じ名前でアクセスできる、という仕組みです。
③「値を使い回す・変える・比べる」場面すべてで変数が活躍する
変数が活躍する場面は大きく3つあります。
- 使い回す:同じ値を複数の計算で使うとき(消費税率、円周率など)
- 変える:ループのカウンタや、ユーザーが入力した値を更新するとき
- 比べる:「点数が60点以上かどうか」「在庫が0かどうか」などの条件判断
int score = 85; // 使い回す
score = score + 10; // 変える(ボーナス加点)
if (score >= 90) { // 比べる(合格判定)
System.out.println("優秀賞!");
}
プログラムのあらゆる場面で変数は登場します。変数を制する者がプログラミングを制すると言っても過言ではありません!
2.Java言語で使う変数は?
①基本データ型(プリミティブ型)の種類と特徴
Javaでは変数を使うとき、必ず「どんなデータを入れるか」という型(データ型)を指定します。型によって、メモリ上で確保される領域のサイズが決まります。
まず覚えておきたいのが基本データ型(プリミティブ型)です。Javaの基本データ型はサイズが固定で、OSやハードウェアに依存しないのが大きな特徴です。
| 型名 | サイズ | 扱えるデータ | 使用例 |
|---|---|---|---|
byte | 8bit | 小さい整数 | データ転送など |
short | 16bit | 短い整数 | メモリ節約時 |
int | 32bit | 整数(最もよく使う) | 個数・点数・年齢 |
long | 64bit | 大きな整数 | 人口・ファイルサイズ |
float | 32bit | 小数(精度低め) | センサー値など |
double | 64bit | 小数(精度高め) | 計算・座標など |
char | 16bit | Unicode文字1文字 | ‘A’、’あ’ |
boolean | — | true / false | フラグ・条件判定 |
日常的によく使うのは int・double・boolean・String(後述)あたりです。まずこの4つをしっかり押さえましょう。
②変数の宣言・代入・初期化の書き方
Javaで変数を使うには、まず宣言が必要です。宣言とは「この名前でこの型の変数を使います」とJavaに伝える行為です。
// 宣言だけ
int score;
// 宣言と同時に初期化(推奨!)
int score = 100;
// 後から値を代入
int score;
score = 100; // ← これでもOK
注意点: Javaでは、初期化せずに変数を使おうとするとコンパイルエラーになります。宣言しただけの変数の値は「不定」とみなされるためです。これは初学者がよくハマるポイントなので要注意!
// ❌ これはコンパイルエラー
int score;
System.out.println(score); // エラー!初期化されていない変数は使えない
// ✅ 正しい書き方
int score = 0;
System.out.println(score); // OK
また、long 型は末尾に L、float 型は F をつけるルールがあります。
long population = 1280000000L; // Lをつけないとint扱いでエラーの可能性
float pi = 3.14F; // Fをつけないとdouble扱いになる
③参照型変数には「データのある場所(参照)」が入る
基本データ型の変数には「値そのもの」が入ります。一方、Javaには参照型という変数もあります。代表例は String(文字列)や配列、クラスのインスタンスなどです。
参照型の変数には、データそのものではなく「データが存在するメモリ上の場所(参照)」が格納されます。このイメージの違いが、後々の「値渡し・参照渡し」の理解につながります。
// 基本データ型:値そのものをコピー
int a = 10;
int b = a; // bにaの「値10」がコピーされる
b = 99; // bを変えてもaは変わらない(aはまだ10)
// 参照型:参照(場所)をコピー
int[] array1 = new int[]{1, 2, 3};
int[] array2 = array1; // array2にarray1の「参照」がコピーされる
array2[0] = 99; // array2を通じて変更すると…
System.out.println(array1[0]); // → 99! array1も変わってしまう
「え、array1まで変わるの?!」と驚いた方は正常な反応です。これが参照型の大事なポイント。同じ場所を2つの変数で指しているから、片方を変えると両方に影響が出るんです。
3.変数について整理しておきたいこと
①変数・定数・リテラルの違い
似たような言葉が並んで混乱しやすいので、ここでしっかり整理しましょう。
| 用語 | 意味 | Javaでの書き方 |
|---|---|---|
| 変数 | 値が変わる入れ物 | int score = 80; |
| 定数 | 一度設定したら変えられない入れ物 | final double TAX = 0.10; |
| リテラル | コードに直接書かれた値そのもの | 100、"hello"、true |
定数は final キーワードをつけて宣言します。税率・円周率など「プログラム中で変わらない値」を定数にしておくと、意図しない書き換えを防げて安全です。
final double TAX_RATE = 0.10;
TAX_RATE = 0.08; // ❌ コンパイルエラー!定数は変更不可
また「リテラル」は定数ではありません。100 というコードに書かれた数値そのものがリテラルです。この違いは試験でも問われるので押さえておきましょう。
②型変換(キャスト)のルールと注意点
異なる型のデータを組み合わせて計算するとき、Javaは自動的に型を変換してくれる場合があります。これを暗黙的な型変換(自動変換)といいます。
int a = 10;
double b = a; // int → double は自動変換OK(精度が上がる方向)
System.out.println(b); // 10.0
逆に精度が下がる方向(double → int など)は、データが失われる可能性があるため明示的なキャストが必要です。
double price = 198.9;
int intPrice = (int) price; // キャスト:小数点以下が切り捨てられる
System.out.println(intPrice); // → 198
実務でよくある注意点として、実数計算の誤差問題があります。
double result = 0.0;
for (int i = 0; i < 1000; i++) {
result += 0.1;
}
System.out.println(result); // 100.0 にならない! ← 誤差が蓄積される
金額など誤差が許されない計算には BigDecimal クラスを使いましょう。処理は少し遅くなりますが、正確な計算ができます。
③変数のスコープ(有効範囲)とコーディング規約
スコープとは、変数が「どこから使えるか」の範囲のことです。Javaでは、変数は宣言されたブロック(波かっこ {} の中)でのみ有効です。
if (true) {
int x = 10; // xはこのブロック内だけで有効
}
System.out.println(x); // ❌ コンパイルエラー!ブロックの外では使えない
コーディング規約として、現場では以下のルールが一般的です。
- ✅ ローカル変数は宣言時に初期化する(後から初期化するより安全)
- ✅ 変数の「使い回し」はしない(意味が異なるデータに同じ変数名を使わない)
- ✅ 変数名は役割がわかる名前をつける(
xよりcustomerAgeの方がわかりやすい) - ✅ スコープはできるだけ狭く保つ(必要な場所で宣言し、無駄に広げない)
// ❌ 変数の使い回し(NG例)
int i;
for (i = 0; i < 5; i++) { /* 処理 */ }
for (i = 0; i < 3; i++) { /* 別の処理でiを再利用 */ }
// ✅ 目的ごとに新しく宣言(推奨)
for (int row = 0; row < 5; row++) { /* 処理 */ }
for (int col = 0; col < 3; col++) { /* 別の処理 */ }
コーディング規約はチームで統一することで、誰が読んでも理解しやすいコードが書けるようになります。最初から良い習慣を身につけましょう!
まとめ
今回はJavaの「変数」について、基礎の基礎からていねいに解説しました。最後にポイントを整理しておきます。
| テーマ | ポイント |
|---|---|
| なぜ変数が必要? | 値を保持・使い回し・変更・比較するために必要。コードの保守性が上がる |
| Java の変数の種類 | 基本データ型(プリミティブ型)と参照型の2種類。型によってメモリ確保のしかたが違う |
| 宣言・代入のルール | 初期化せずに使うとコンパイルエラー。long はL、float はFをつける |
| 変数・定数・リテラル | 混同しやすいが役割が異なる。定数は final で宣言し変更不可 |
| 型変換とスコープ | 精度が下がる変換はキャスト必須。金額計算は BigDecimal を使う。スコープは狭く保つ |
変数はプログラミングの最重要基礎です。「なぜそうなのか」を理解した上で使いこなせるようになると、条件分岐もループも一気に理解しやすくなります。ぜひ今日紹介したコード例を実際に動かして、自分の手で確かめてみてください!
次回は「演算子と条件分岐」について解説予定です。お楽しみに!
