はじめに
Javaでプログラムを書く際、最も基本となるのが「変数」と「データ型」の理解です。変数はデータを格納する箱であり、データ型はその箱に入れられるデータの種類を決定します。Javaは静的型付け言語であり、すべての変数は使用前に型を宣言する必要があります。
この記事では、Javaの8つのプリミティブ型と参照型の違い、変数の宣言・初期化、型変換、そしてJava 10以降で導入されたvarによる型推論まで、段階的に解説します。
変数の宣言と初期化
変数を使用するには、まず「宣言」と「初期化」が必要です。
変数の宣言
変数の宣言は、型と変数名を指定して行います。
|
|
変数の初期化
宣言した変数に値を代入することを「初期化」と呼びます。
|
|
変数の命名規則
Javaでは変数名に関して以下のルールがあります。
| ルール | 例 |
|---|---|
先頭は英字、_(アンダースコア)、$のいずれか |
_count、$value、name |
| 2文字目以降は数字も使用可能 | item1、price2 |
| 予約語は使用不可 | int、class、forなどは使えない |
| 大文字と小文字は区別される | Nameとnameは別の変数 |
慣例として、変数名はキャメルケース(firstName、totalAmount)で記述します。
8つのプリミティブ型を理解する
Javaには8つのプリミティブ型(基本データ型)があります。これらはJVM(Java仮想マシン)に組み込まれた型であり、オブジェクトではありません。
整数型
整数を扱う型は4種類あり、それぞれ格納できる値の範囲が異なります。
| 型 | サイズ | 最小値 | 最大値 | 用途 |
|---|---|---|---|---|
byte |
8ビット | -128 | 127 | メモリ節約が必要な場合 |
short |
16ビット | -32,768 | 32,767 | メモリ節約が必要な場合 |
int |
32ビット | -2,147,483,648 | 2,147,483,647 | 一般的な整数(デフォルト) |
long |
64ビット | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 | 大きな整数値 |
|
|
long型のリテラルには末尾にL(またはl)を付ける必要があります。小文字のlは数字の1と紛らわしいため、大文字のLを使用することが推奨されます。
浮動小数点型
小数を扱う型は2種類あります。
| 型 | サイズ | 精度 | 用途 |
|---|---|---|---|
float |
32ビット | 約7桁 | メモリ節約が必要な場合 |
double |
64ビット | 約15桁 | 一般的な小数(デフォルト) |
|
|
金融計算など高精度が必要な場合は、floatやdoubleではなくjava.math.BigDecimalクラスを使用してください。浮動小数点型は2進数で表現されるため、10進数の正確な表現ができない場合があります。
文字型
char型は1つのUnicode文字(16ビット)を格納します。
|
|
シングルクォート(')で囲むことに注意してください。ダブルクォート(")はString型用です。
論理型
boolean型はtrueまたはfalseの2値のみを持ちます。
|
|
プリミティブ型の一覧とデフォルト値
フィールド(クラス変数・インスタンス変数)として宣言された場合、プリミティブ型には以下のデフォルト値が設定されます。
| 型 | デフォルト値 |
|---|---|
byte |
0 |
short |
0 |
int |
0 |
long |
0L |
float |
0.0f |
double |
0.0d |
char |
‘\u0000’(null文字) |
boolean |
false |
ローカル変数にはデフォルト値が設定されないため、使用前に必ず初期化する必要があります。
数値リテラルの便利な記法
Java 7以降では、数値リテラルにアンダースコア(_)を挿入して読みやすくできます。
|
|
参照型とは何か
参照型は、オブジェクトへの「参照(メモリアドレス)」を格納する型です。プリミティブ型が値そのものを格納するのに対し、参照型はオブジェクトが格納されているメモリ上の場所を指し示します。
プリミティブ型と参照型の違い
以下の図は、プリミティブ型と参照型のメモリ上での違いを示しています。
graph LR
subgraph "プリミティブ型"
A["変数 age"] --> B["値: 25"]
end
subgraph "参照型"
C["変数 person"] --> D["参照(アドレス)"]
D --> E["Personオブジェクト<br/>name: 'Taro'<br/>age: 25"]
end代表的な参照型
|
|
参照型の特徴
参照型には以下の特徴があります。
- nullを代入可能: 参照型の変数には
nullを代入でき、「何も参照していない」状態を表現できます - メソッドを持つ: オブジェクトはメソッドを持ち、操作を行えます
- ヒープメモリに格納: オブジェクト本体はヒープ領域に格納されます
|
|
ラッパークラス
各プリミティブ型には対応するラッパークラスがあります。これにより、プリミティブ値をオブジェクトとして扱えます。
| プリミティブ型 | ラッパークラス |
|---|---|
byte |
Byte |
short |
Short |
int |
Integer |
long |
Long |
float |
Float |
double |
Double |
char |
Character |
boolean |
Boolean |
|
|
型変換(暗黙的変換と明示的キャスト)
異なる型の間で値を変換する必要がある場合があります。Javaには2種類の型変換があります。
暗黙的変換(拡大変換)
小さい型から大きい型への変換は自動的に行われます。データの損失がないため、コンパイラが自動で変換します。
graph LR
A[byte] --> B[short]
B --> C[int]
C --> D[long]
D --> E[float]
E --> F[double]
G[char] --> C
|
|
明示的キャスト(縮小変換)
大きい型から小さい型への変換は、データの損失が発生する可能性があるため、明示的なキャストが必要です。
|
|
キャスト時にオーバーフローが発生すると、予期しない値になることがあります。キャストを行う前に値の範囲を確認することが重要です。
文字列との変換
プリミティブ型と文字列の相互変換は頻繁に行われます。
|
|
varによるローカル変数型推論(Java 10以降)
Java 10で導入されたvarキーワードを使用すると、コンパイラが右辺の値から型を推論してくれます。
varの基本的な使い方
|
|
varの使用条件と制限
varは以下の条件で使用できます。
| 使用可能 | 使用不可 |
|---|---|
| ローカル変数 | フィールド(インスタンス変数) |
| forループの変数 | メソッドの引数 |
| try-with-resourcesの変数 | メソッドの戻り値型 |
| 初期化なしの宣言 | |
| nullでの初期化 |
|
|
varを使うべき場面
varは可読性を高める場面で使用し、型が不明確になる場面では避けることが推奨されます。
|
|
定数の定義(final)
finalキーワードを使用すると、一度代入した値を変更できない定数を定義できます。
final変数の宣言
|
|
定数名は慣例として大文字のスネークケース(MAX_SIZE、DEFAULT_VALUE)で記述します。
finalの使用場面
|
|
final参照型の注意点
finalで宣言した参照型は、参照先の変更は禁止されますが、オブジェクトの内容は変更可能です。
|
|
よくあるエラーと対処法
Java初心者がつまずきやすいエラーと対処法を紹介します。
変数の未初期化エラー
ローカル変数を初期化せずに使用するとコンパイルエラーになります。
|
|
型の不一致エラー
互換性のない型を代入しようとするとエラーになります。
|
|
オーバーフロー
型の範囲を超える値を格納しようとすると、予期しない結果になります。
|
|
NullPointerException
参照型変数がnullの状態でメソッドを呼び出すと発生します。
|
|
精度の損失警告
暗黙的な縮小変換はコンパイルエラーになります。
|
|
まとめ
この記事では、Javaの変数とデータ型について以下の内容を解説しました。
- 変数の宣言と初期化:型と変数名を指定し、値を代入する基本構文
- 8つのプリミティブ型:整数型(byte、short、int、long)、浮動小数点型(float、double)、文字型(char)、論理型(boolean)
- 参照型:オブジェクトへの参照を格納し、nullを許容する型
- 型変換:暗黙的変換(拡大変換)と明示的キャスト(縮小変換)
- var:Java 10以降のローカル変数型推論
- final:変更不可の定数定義
Javaの型システムを正しく理解することで、バグの少ない堅牢なコードを書けるようになります。次のステップとして、演算子と制御構文を学び、より複雑なプログラムロジックを構築していきましょう。