Javaでプログラミングを学ぶ際に、最も基本的かつ重要な概念の一つが「変数」です。
変数は、プログラム内で扱うデータを一時的に保存しておくための箱のような役割を果たします。
数値や文字、あるいは複雑なオブジェクトといった情報を変数に格納することで、私たちは計算を行ったり、結果を画面に表示したり、条件に応じて処理を分岐させたりすることが可能になります。
この記事では、Javaにおける変数の基礎知識から、宣言や初期化の具体的な方法、そしてデータ型の種類やスコープといった応用的な内容まで、初心者の方にも分かりやすく徹底的に解説します。
変数とは何か:データを扱うための「箱」
プログラミングにおける変数とは、「データに名前を付けて保存するためのメモリ上の領域」を指します。
現実世界で例えるなら、中身がわかるようにラベルを貼った「整理箱」のようなものです。
例えば、ある数値をプログラムのあちこちで使いたい場合、その数値を直接書き込む(ハードコーディングする)のではなく、変数に入れておくことで、後から値を変更したくなったときに一箇所の修正で済むようになります。
また、変数名を見ることで、そのデータが何を意味しているのか(金額なのか、ユーザー名なのかなど)が明確になり、プログラムの可読性が飛躍的に向上します。
変数を使うメリット
変数を利用することには、主に以下の3つのメリットがあります。
- 再利用性
一度保存した値を、プログラム内の複数の場所で何度も使い回すことができます。
- 保守性
値が変わった場合でも、変数の定義部分を書き換えるだけで、それを利用しているすべての場所に反映されます。
- 可読性
意味のある名前を付けることで、コードが何をしているのかが理解しやすくなります。
変数の宣言と初期化
Javaで変数を使うためには、まず「宣言」という作業が必要です。
これは、コンピュータに対して「これからこの名前の変数を使います」と予約を入れるような行為です。
変数の宣言
変数の宣言は、その変数がどのような種類のデータを扱うかを示す「型」と、その変数に付ける「名前(識別子)」を組み合わせて行います。
// 型 変数名;
int age;
String name;
上記の例では、int型(整数)のageという変数と、String型(文字列)のnameという変数を宣言しています。
この時点では、まだ箱を用意しただけで、中身は空の状態(厳密にはローカル変数の場合は未定義)です。
変数の初期化と代入
宣言した変数に初めて値をいれることを「初期化」と呼びます。
また、すでに値が入っている変数に別の値をいれることは「代入」と呼ばれます。
Javaでは、=(イコール)記号を使って右辺の値を左辺の変数に格納します。
int score; // 宣言
score = 100; // 初期化
score = 80; // 代入(値の上書き)
宣言と初期化を一行でまとめて行うことも可能です。
実際の開発現場では、この書き方が最も一般的です。
int energy = 50;
String message = "こんにちは";
変数の使用例
実際に変数を使った簡単なプログラムを見てみましょう。
public class Main {
public static void main(String[] args) {
// 変数の宣言と初期化
String fruit = "りんご";
int price = 150;
int count = 3;
// 計算結果を変数に代入
int totalPrice = price * count;
// 結果の出力
System.out.println("商品名: " + fruit);
System.out.println("合計金額: " + totalPrice + "円");
}
}
商品名: りんご
合計金額: 450円
変数名の命名規則と慣習
Javaでは、変数に付ける名前には自由度がありますが、守らなければならないルール(命名規則)と、一般的に推奨される書き方(慣習)があります。
命名の基本ルール
以下のルールに反すると、コンパイルエラーが発生してプログラムが動きません。
- 使用可能な文字:英数字、アンダースコア
_、通貨記号($など)が使用できます。 - 数字の制限:名前の先頭に数字を使うことはできません(例:1stScore はNG)。
- 大文字と小文字の区別:
nameとNameは別の変数として扱われます。 - 予約語の禁止:
public、class、int、ifといったJavaが自身の機能として予約している単語は使用できません。
推奨される慣習(キャメルケース)
Javaの世界では、複数の単語を組み合わせる際に「キャメルケース(lowerCamelCase)」を用いるのが一般的です。
- 最初の単語は小文字から始める。
- 2つ目以降の単語の先頭を大文字にする。
- 例:
userName、totalPrice、isMemberRegistered
また、変数は「その中身が何であるか」を具体的に表す名前にすることが大切です。
a や x といった一文字の変数名は、ループのインデックスなどを除いて避けるべきです。
Javaのデータ型:基本型と参照型
Javaは「静的型付け言語」であり、すべての変数にはあらかじめ決められた「型」が存在します。
型は大きく分けて、「基本型(プリミティブ型)」と「参照型」の2種類に分類されます。
1. 基本型(プリミティブ型)
基本型は、データそのものの値を直接保持する型です。
Javaには以下の8種類が用意されています。
| 分類 | 型名 | サイズ | 扱うデータの範囲・内容 |
|---|---|---|---|
| 整数 | byte | 8 bit | -128 ~ 127 |
| 整数 | short | 16 bit | -32,768 ~ 32,767 |
| 整数 | int | 32 bit | 約-21億 ~ 約21億(最も一般的) |
| 整数 | long | 64 bit | 非常に大きな整数(末尾に L を付ける) |
| 小数 | float | 32 bit | 単精度浮動小数点数(末尾に f を付ける) |
| 小数 | double | 64 bit | 倍精度浮動小数点数(小数の標準) |
| 文字 | char | 16 bit | Unicode文字1文字(シングルクォート ' で囲む) |
| 論理値 | boolean | – | true または false |
特に整数では int、小数では double が標準的に使われます。
2. 参照型
参照型は、データそのものではなく、データが保存されているメモリ上の「場所(アドレス)」を保持する型です。
- String:文字列を扱うクラス(ダブルクォート
"で囲む)。 - 配列:複数のデータをまとめて扱う構造。
- クラス・インターフェース:ユーザーが定義した独自の型など。
例えば、String は厳密にはクラスであり、基本型ではありません。
そのため、多くの便利なメソッド(文字列を操作する機能)を持っています。
String text = "Java Programming";
// 文字列の長さを取得するメソッドの使用
int length = text.length();
定数:値を変更したくない場合
一度代入した値を二度と変更させたくない場合には、「定数」を使用します。
Javaでは final 修飾子を付けて宣言します。
final double PI = 3.14159;
// PI = 3.14; // 再代入しようとするとコンパイルエラーになる
定数名の命名ルールとしては、すべて大文字で書き、単語の区切りをアンダースコアで繋ぐ「スネークケース(CONSTANT_CASE)」が一般的です(例:TAX_RATE)。
型推論(var)の利用
Java 10以降では、ローカル変数の宣言において型を明示せずに var と書くことができる「ローカル変数型推論」が導入されました。
var name = "Alice"; // String型と推論される
var age = 25; // int型と推論される
コンパイラが右辺の初期値から型を自動的に判断してくれます。
コードがスッキリするというメリットがありますが、初期化を同時に行う必要があり、またあまり多用しすぎるとコードをパッと見た時に型が分かりにくくなることもあるため、適切に使い分けることが重要です。
変数の有効範囲(スコープ)
変数には、それを使用できる有効範囲(スコープ)が決まっています。
Javaの変数は、大きく分けて以下の3種類に分類されます。
1. ローカル変数
メソッドの中で宣言された変数です。
そのメソッドの中、あるいは宣言されたブロック {} の中だけで有効です。
メソッドの処理が終わると、その変数はメモリから消滅します。
2. インスタンス変数(フィールド)
クラスの中で、メソッドの外側に宣言された変数です。
クラスから作成された「オブジェクト(インスタンス)」ごとに値を保持します。
オブジェクトが生存している間、その値を保持し続けます。
3. クラス変数(static変数)
クラスの中で static を付けて宣言された変数です。
そのクラスから作られるすべてのオブジェクトで共有される一つの変数となります。
public class Sample {
// インスタンス変数
int instanceValue = 10;
// クラス変数
static int staticValue = 20;
public void display() {
// ローカル変数
int localValue = 30;
System.out.println(localValue);
}
}
型変換(キャスト)
プログラムを書いていると、ある型の値を別の型に移し替えたい場面が出てきます。
これを「型変換」と呼びます。
自動型変換(暗黙的な型変換)
小さなサイズの型から大きなサイズの型へ代入する場合、データが失われる心配がないため、Javaが自動的に変換してくれます。
int i = 100;
double d = i; // intからdoubleへ自動変換
System.out.println(d); // 100.0 と出力される
強制型変換(明示的なキャスト)
逆に、大きな型から小さな型へ代入する場合や、小数から整数へ変換する場合は、精度が落ちたりデータが溢れたりする可能性があるため、プログラマが明示的に「キャスト」を行う必要があります。
double d = 10.5;
int i = (int)d; // doubleからintへ強制変換(小数点以下は切り捨て)
System.out.println(i); // 10 と出力される
Javaの変数に関する注意点
初心者が陥りやすい変数のトラブルについても触れておきます。
1. 初期化忘れ
ローカル変数は、使用する前に必ず初期化する必要があります。
初期化せずに値を使おうとすると、Javaのコンパイラがエラーを出して教えてくれます。
2. 浮動小数点数の精度
double や float は計算時に微小な誤差が生じることがあります。
お金の計算など、極めて高い精度が求められる場合は、BigDecimal という特別なクラスを使用するのがJavaの定石です。
3. ヌルポインタ(NullPointerException)
参照型の変数に何も入っていない状態を null と呼びます。
null が入っている変数に対してメソッドを呼び出そうとすると、Javaで最も有名なエラーの一つである「NullPointerException」が発生します。
参照型を扱う際は、中身が null でないか常に意識する必要があります。
実践プログラム:変数を活用した計算
最後に、これまで学んだ内容を盛り込んだ実践的なコードを確認しましょう。
このプログラムでは、商品の税込み価格を計算し、フォーマットして表示します。
public class VariableExample {
// クラス定数(消費税率)
static final double TAX_RATE = 0.10;
public static void main(String[] args) {
// 変数の宣言と初期化
String itemName = "高性能ノートPC";
int price = 128000;
int quantity = 2;
// 計算処理(型変換を含む)
int subtotal = price * quantity;
int tax = (int)(subtotal * TAX_RATE); // キャストによる端数切り捨て
int totalAmount = subtotal + tax;
// 結果の表示
System.out.println("--- 注文明細 ---");
System.out.println("商品名: " + itemName);
System.out.println("単価: " + price + "円");
System.out.println("数量: " + quantity);
System.out.println("小計: " + subtotal + "円");
System.out.println("消費税 (" + (TAX_RATE * 100) + "%): " + tax + "円");
System.out.println("----------------");
System.out.println("合計金額: " + totalAmount + "円");
}
}
--- 注文明細 ---
商品名: 高性能ノートPC
単価: 128000円
数量: 2
小計: 256000円
消費税 (10.0%): 25600円
----------------
合計金額: 281600円
このコードでは、文字列型の String、整数型の int、そして定数としての static final を使い分けています。
また、税額計算の部分では小数を整数に変換するために (int) というキャストを利用しています。
このように変数を組み合わせることで、複雑なロジックを整理して記述できるようになります。
まとめ
Javaにおける変数は、プログラムを構成する最も基礎的な要素です。
- 変数はデータを一時的に保管する「箱」であり、名前を付けて管理する。
- 宣言(型と名前の定義)と初期化(最初の値の代入)が必要。
- データ型には、値を直接持つ「基本型」と、場所を指し示す「参照型」がある。
- 定数(final)を使うことで、不用意な値の書き換えを防ぎ、安全性を高められる。
- スコープを理解することで、変数がどこで使えるかを正しく制御できる。
変数の使い方をマスターすることは、Javaプログラミングの上達において欠かせないステップです。
まずは自分で様々な型の変数を宣言し、計算や文字列結合などを試してみてください。
手を動かしてコードを書くことで、型の違いやスコープの感覚が自然と身についていくはずです。
基礎をしっかりと固めて、より高度なオブジェクト指向の世界へと進んでいきましょう。
