Java変数の基礎と実務での使い方【型・スコープ・命名規則】

Mirai

Javaの変数って、どう使えばいいの?

Zetto

変数はJavaプログラムの土台ですね。型・スコープ・命名規則を正しく理解すれば、バグの少ない読みやすいコードが書けるようになります。

この記事では、Java変数の基礎から実務で使えるレベルの知識まで解説します。

Zettoのライタープロフィール

本記事の専門性
現役エンジニアのZettoです。Java Goldの資格を持ち、Javaを使ったフリーランス案件を複数経験しています。

変数の扱い方を曖昧なままにしておくと、NullPointerExceptionや型不一致エラーで詰まり続けて、学習が止まってしまいます。

この記事を読めば、Javaの変数の宣言・データ型・スコープ・命名規則・よくあるエラーの対処法がわかります。

ぜひ参考にしてみてください。

目次

Java変数とは?宣言・初期化の基本をおさえよう

Java変数の宣言・初期化の基本

Javaを書く上で、変数の概念は最初に理解しておきたい基礎です。

  • 変数とは「データを入れる箱」のこと
  • 変数の宣言・初期化・代入の書き方
  • 変数を使わないとどうなる?基礎から理解するメリット

順にみていきましょう。

変数とは「データを入れる箱」のこと

変数とは、データを一時的に保存しておくための「名前付きの箱」です。

プログラムの中で数値・文字・フラグなどを扱うとき、毎回値をそのまま書くのではなく、変数に名前をつけて管理します。

Javaでは、変数を使う前に必ず「型」と「名前」を宣言する必要があります。この点は、型宣言が不要なPythonやJavaScriptとは大きな違いです。

変数のイメージはこんな感じです。

  • 箱(変数)に名前(変数名)をつける:後からコードのどこからでも呼び出せる
  • 箱の形(型)を決める:その箱に入れられるデータの種類が決まる
  • 箱に値を入れる(代入):プログラムが実行されるタイミングで値が確定する

型を指定することで、コンパイル時にミスを検出できるのがJavaの強みですね。

Zetto

型を明示することは、バグの早期発見につながります。最初は手間に感じるかもしれませんが、大規模な案件ほどこの仕組みがありがたくなってきます。

変数の宣言・初期化・代入の書き方

変数に関する3つの操作は、それぞれ意味が異なります。

  • 宣言:変数の型と名前を定義すること
  • 初期化:宣言と同時に初期値を設定すること
  • 代入:すでに宣言した変数に値を入れること

実際のコードで確認してみます。

// 宣言のみ
int age;

// 宣言と同時に初期化
int age = 25;

// 宣言後に代入
int age;
age = 25;

宣言と初期化を同時に行う書き方が最もよく使われます。

また、一度宣言した変数に別の値を上書きすることもできます。

int score = 80;
score = 95; // 上書き
System.out.println(score); // 95が出力される

代入のたびに前の値は消えるので、必要であれば別の変数に保存しておくようにしましょう。

変数を使わないとどうなる?基礎から理解するメリット

変数を使わずに同じ値を何度もコードに直接書くと、以下のような問題が起きます。

  • 修正コストが跳ね上がる:同じ値が100箇所に書かれていると、全部を探して変更しなければならない
  • 意味が伝わらない:3.14 より PI のほうが何を意味するかが一目でわかる
  • バグが混入しやすい:手打ちの値が増えると、タイポやコピーミスが起きやすい

変数を使うことで、コードの可読性・保守性・安全性が大きく向上します。

変数はプログラムの基礎ですが、使い方次第でコードの品質が変わってくるものです。

Zetto

僕が実務でJavaのコードを読んだとき、意味のない変数名のコードに悩まされました。変数名ひとつで読みやすさが全然違うので、名前のつけ方は意識しておく価値があります。

Javaのデータ型|プリミティブ型と参照型の使い分け

プリミティブ型と参照型の違い

Javaの変数を正しく使うためには、データ型の理解が欠かせません。

  • プリミティブ型8種類の特徴と選び方
  • 参照型(String・配列・クラス)との違い
  • intとIntegerの違いとオートボクシングの仕組み

型を使い分けられるようになると、無駄のないメモリ管理ができるようになります。

プリミティブ型8種類の特徴と選び方

Javaには8種類のプリミティブ型(基本データ型)が用意されています。

byte(8bit):小さな整数(-128〜127)
short(16bit):やや小さな整数
int(32bit):一般的な整数(最もよく使う)
long(64bit):大きな整数(末尾にLをつける)
float(32bit):小数(末尾にfをつける)
double(64bit):より精度の高い小数
char(16bit):1文字(シングルクォートで囲む)
boolean(1bit相当):true / false

実務で最もよく使うのは int・double・boolean・char の4つです。

int age = 25;
double price = 1980.5;
boolean isLoggedIn = true;
char grade = 'A';

整数は基本的に int、大きな数値が必要なら long、小数は double を使えばほぼ問題ありません。

Zetto

float はメモリ節約のために使われることもありますが、精度が double より低いので、迷ったら double を選ぶのが無難です。

参照型(String・配列・クラス)との違い

プリミティブ型は「値そのもの」を変数に格納しますが、参照型は「オブジェクトのアドレス(参照)」を格納します。

代表的な参照型は以下の通りです。

  • String:文字列を扱う(ダブルクォートで囲む)
  • 配列:同じ型のデータを複数まとめて管理する
  • クラス(インスタンス):自作クラスや標準ライブラリのオブジェクト
// String(参照型)
String name = "Zetto";

// 配列(参照型)
int[] scores = {80, 90, 70};

// クラス(参照型)
ArrayList list = new ArrayList<>();

参照型の変数には null を代入できます。これがNullPointerExceptionの原因になることがあるので、後述の「エラーと対処法」のセクションでも触れます。

プリミティブ型と参照型の使い分けは、型を正しく選ぶ第一歩です。

intとIntegerの違いとオートボクシングの仕組み

Javaには int(プリミティブ型)と Integer(ラッパークラス・参照型)の2種類があります。

両者の主な違いは以下の通りです。

  • int:値を直接保持する。null を代入できない
  • Integer:オブジェクトとして扱う。null を代入できる。コレクション(ArrayList など)で必要
int a = 10;
Integer b = 10;       // Integerはオブジェクト
Integer c = null;     // nullを代入できる
// int d = null;      // コンパイルエラー

Java 5以降では「オートボクシング」により、int と Integer は自動的に変換されます。

Integer x = 5;   // int → Integerへ自動変換(ボクシング)
int y = x;       // Integer → intへ自動変換(アンボクシング)

ただし、Integer 型の変数が null のままアンボクシングされると、NullPointerExceptionが発生します。

Zetto

コレクションを使う場面では Integer が必要になりますが、普通の計算では int を使うほうが処理が速く、シンプルです。どちらを使うかは用途に合わせて判断しましょう。

変数の種類とスコープ(有効範囲)を正しく理解する

変数の種類とスコープ解説

変数はどこで宣言するかによって、使える範囲(スコープ)が変わります。

  • ローカル変数・インスタンス変数・クラス変数の違い
  • スコープを意識してバグを防ぐ書き方
  • finalとstaticの使いどころと注意点

スコープを正しく理解することで、意図しない値の書き換えや参照エラーを防げます。

ローカル変数・インスタンス変数・クラス変数の違い

Javaの変数は、宣言する場所によって3種類に分類されます。

  • ローカル変数:メソッドやブロック内で宣言。そのメソッドの中だけで有効
  • インスタンス変数:クラス内・メソッドの外で宣言。インスタンスごとに独立した値を持つ
  • クラス変数(static変数):static をつけてクラス内で宣言。全インスタンスで共有される
public class Player {

    // インスタンス変数(各Playerオブジェクトごとに独立)
    String name;
    int hp;

    // クラス変数(全Playerで共有)
    static int totalCount = 0;

    public void attack() {
        // ローカル変数(このメソッド内だけで有効)
        int damage = 10;
        System.out.println(damage);
    }
}

3種類の変数はそれぞれ役割が異なるので、用途に合わせて使い分けることが大切です。

スコープを意識してバグを防ぐ書き方

スコープの外にある変数にアクセスしようとすると、コンパイルエラーになります。

public void example() {
    if (true) {
        int x = 10; // ifブロック内のローカル変数
    }
    System.out.println(x); // コンパイルエラー:xはスコープ外
}

スコープを意識した書き方のポイントは以下の通りです。

  • 変数は使う直前に宣言する:スコープを最小限にすることで影響範囲を絞れる
  • 同じ変数名をネストした内側で再宣言しない:意図しない上書きの元になる
  • インスタンス変数に何でも入れない:本当にクラス全体で必要な値だけをフィールドにする

スコープを絞ることは、バグを減らすだけでなく、コードの意図を読み手に伝えやすくする効果もあります。

Zetto

実務のコードレビューで「なぜこの変数がフィールドになっているの?」と指摘されることは意外と多いです。ローカルで済むものはローカルに収めるのが基本方針です。

finalとstaticの使いどころと注意点

final と static はよく使われるキーワードですが、それぞれ意味が異なります。

// final(再代入を禁止する)

final int MAX_HP = 100;
MAX_HP = 200; // コンパイルエラー:finalには再代入不可

一度決めたら変えない定数に使います。変数名はすべて大文字・アンダースコア区切りにするのが慣例です。

// static(クラス全体で共有する)

public class Config {
    static final String BASE_URL = "https://example.com";
}

// 呼び出し(インスタンスを作らずにアクセスできる)
System.out.println(Config.BASE_URL);

static final を組み合わせることで、クラス定数として使えます。

注意点としては、static 変数はプログラム全体で共有されるため、意図しない変更が起きると全体に影響します。

スコープ・final・staticの正しい理解は、実務でのコードの信頼性に直結します。

Zetto

僕が携わったJavaの案件では、static final で定義した設定値をクラスにまとめておくパターンがよく使われていました。定数を一箇所にまとめると、後の修正がとても楽になります。

実務で差がつくJava変数の使い方

実務のJava変数使い方

変数の基礎が身についたら、実務レベルの使い方を意識していきましょう。

  • Google Java Style Guideに準拠した命名規則
  • Java 10以降のvar(型推論)の使いどころ
  • 初心者がハマりやすいエラーと対処法

実務では「動くコード」だけでなく「読みやすくて保守できるコード」が求められます。

Google Java Style Guideに準拠した命名規則

Javaの変数名には、業界標準としてGoogle Java Style Guideが広く参照されています。

基本ルールをまとめます。

  • ローカル変数・インスタンス変数:lowerCamelCase(例:userName、totalPrice)
  • クラス変数(定数):UPPER_SNAKE_CASE(例:MAX_SIZE、BASE_URL)
  • クラス名:UpperCamelCase(例:UserService、OrderItem)
// 良い命名例
int userAge = 30;
String productName = "Java入門";
final int MAX_RETRY_COUNT = 3;

// 避けたい命名例
int a = 30;           // 意味が伝わらない
String str = "Java入門"; // 型名をそのまま使うのは非推奨

意味のある変数名をつけることは、チーム開発でのコードレビューを通りやすくする上でも重要です。

Zetto

変数名に tmp や data など意味の薄い名前をつけると、後から読み返したときに「これは何だっけ?」となりがちです。書いた直後はわかっていても、1週間後には忘れますよ。

Java 10以降のvar(型推論)の使いどころ

Java 10から、ローカル変数に var キーワードを使えるようになりました。コンパイラが右辺から型を自動で推論してくれます。

// 従来の書き方
ArrayList list = new ArrayList();

// varを使った書き方
var list = new ArrayList();

var が使えるのはローカル変数のみです。フィールド・メソッドの引数・戻り値には使えません。

使いどころのポイントは以下の通りです。

  • 型が右辺から明らかな場合に使うと、コードがすっきりする
  • 型が読み取りにくくなる場合は使わないほうがわかりやすい
  • var を使っても実際には型推論されているので、型安全は保たれる
// 適切な使い方(右辺から型が明らか)
var count = 0;
var name = "Zetto";

// 避けたほうが無難な使い方(型が不明確)
var result = someComplexMethod(); // resultの型が読み手にわからない

var は便利ですが、可読性を下げない範囲で使うのが基本的な方針です。

初心者がハマりやすいエラーと対処法

未初期化エラー(コンパイルエラー)の直し方

Javaのローカル変数は、初期化せずに使うとコンパイルエラーになります。

int score;
System.out.println(score); // コンパイルエラー:変数scoreが初期化されていない

対処法は、使う前に必ず初期値を設定することです。

int score = 0; // 初期値を設定してからアクセスする
System.out.println(score);

インスタンス変数・クラス変数はデフォルト値(intは0、booleanはfalse、参照型はnull)が自動で設定されますが、ローカル変数は自動初期化されないので注意が必要です。

NullPointerExceptionが起きる原因と回避策

NullPointerExceptionは、null が入った参照型変数のメソッドや属性にアクセスしようとしたときに発生します。

String name = null;
System.out.println(name.length()); // NullPointerException!

回避策は、使う前に null チェックを行うことです。

String name = null;
if (name != null) {
    System.out.println(name.length());
}

Java 8以降では Optional を使った書き方もあります。また、変数を宣言したら null のままにせず、適切な初期値(空文字や空リストなど)を入れておく習慣が有効です。

Zetto

NullPointerExceptionはJava初心者が最も遭遇するエラーのひとつです。「参照型にはnullが入り得る」という意識を常に持っておくと、エラーを未然に防ぎやすくなります。

型不一致エラーの見分け方

型不一致エラー(incompatible types)は、宣言した型と代入しようとした値の型が合わないときに発生します。

int num = 3.14;   // コンパイルエラー:doubleをintに代入できない
String s = 100;   // コンパイルエラー:intをStringに代入できない

対処法は以下の通りです。

  • キャスト(型変換)を使う:int num = (int) 3.14;(小数点以下は切り捨て)
  • 型を合わせる:変数の型を double に変えるか、値を 3 に変える
  • String変換:String s = String.valueOf(100); で数値を文字列に変換する
// キャストで対応
double pi = 3.14;
int rounded = (int) pi; // 3になる(切り捨て)

// String変換
int num = 100;
String s = String.valueOf(num); // "100"

エラーメッセージに書かれている型名をよく読むと、何と何が食い違っているかがわかります。

実務レベルで変数を扱うには、命名・型・エラー対処の3つをセットで理解しておくのが近道かなと思います。

Zetto

型不一致エラーはIDEがリアルタイムで教えてくれることが多いです。IntelliJ IDEAやEclipseを使うと、エラーの原因がすぐわかるので、開発環境の整備もあわせておすすめです。

Java変数の演習問題

Java変数の演習問題

理解を深めるために、演習問題を3つ用意しました。

  • 型を選んで変数を宣言してみよう
  • スコープを意識してエラーを直してみよう
  • 命名規則に従ってリファクタリングしてみよう

演習問題1:型を選んで変数を宣言してみよう

問題

以下の情報を変数として宣言してください。適切なデータ型を自分で選んでみましょう。

  • ユーザーの年齢(整数)
  • 商品の価格(小数あり)
  • ログイン状態(true / false)
  • ユーザー名(文字列)

解答例

int userAge = 25;
double itemPrice = 1980.5;
boolean isLoggedIn = true;
String userName = "Zetto";

解説

年齢や個数など整数を扱うときは int、消費税込みの価格など小数点が必要なときは double を使います。フラグ管理には boolean、名前や文章には String が定番です。型を選ぶ基準は「その値がどんな形をしているか」です。

演習問題2:スコープを意識してエラーを直してみよう

問題

以下のコードにはコンパイルエラーがあります。エラーの原因を特定して修正してください。

public class ScopeExample {
    public static void main(String[] args) {
        if (true) {
            int message = 100;
        }
        System.out.println(message); // ここでエラー
    }
}

解答例

public class ScopeExample {
    public static void main(String[] args) {
        int message = 0; // ifブロックの外に宣言を移動
        if (true) {
            message = 100;
        }
        System.out.println(message); // 100が出力される
    }
}

解説

message はifブロック内で宣言されているため、ブロックの外からはアクセスできません。スコープ外の変数を参照するとコンパイルエラーになります。変数を複数の場所で使いたい場合は、使う範囲全体を含むスコープで宣言するようにしましょう。

演習問題3:命名規則に従ってリファクタリングしてみよう

問題

以下のコードを、Google Java Style Guideの命名規則に従ってリファクタリングしてください。

int A = 30;
String str1 = "田中太郎";
final int n = 5;
boolean Flag = false;

解答例

int userAge = 30;
String userName = "田中太郎";
final int MAX_RETRY_COUNT = 5;
boolean isLoggedIn = false;

解説

ローカル変数はlowerCamelCase(先頭小文字・単語の区切りは大文字)が基本です。定数(final)はUPPER_SNAKE_CASEにします。A・str1・Flag のような名前は意味が伝わらなかったり、命名規則に違反していたりします。変数名はコードを読む人への「説明」にもなります。

Zetto

演習問題は実際に手を動かしてみると、頭への定着が変わります。コードを書いて実行して、エラーを直す経験を積むのが上達への近道です。

Java変数の基礎を固めて、実務レベルの書き方を目指そう

Java変数の基礎と実務レベル

本記事の内容をまとめます。

  • 変数とはデータを保存する「名前付きの箱」。型・名前・値の3点セットで管理する
  • データ型はプリミティブ型と参照型に分類される。用途に合わせて使い分ける
  • スコープを正しく理解すると、バグを防ぎやすくなる
  • 命名規則はGoogle Java Style Guideを参考に、読みやすい名前をつける
  • よくあるエラー(未初期化・NullPointerException・型不一致)は原因と対処法を知っておく
Mirai

変数ってこんなに奥が深かったんだね。型とかスコープとか、今まで何となく使ってたかも。

Zetto

変数は地味に見えるけど、ここをしっかり理解しておくと後の学習がスムーズになるよ。型エラーやNullPointerExceptionで詰まったとき、今日の内容を思い出してみてね。

Javaをさらに深く学びたい方は、if文の使い方を基礎から解説している記事もあわせてチェックしてみてください。

メソッドの書き方や引数・戻り値の扱いに興味がある方は、こちらの記事も参考にしてみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次