Javaプログラミングを学び始めると、必ずと言っていいほど最初に直面する壁が「クラス」という概念です。

Javaはオブジェクト指向言語と呼ばれ、その中心的な役割を担うのがクラスです。

プログラムを構成する最小単位であり、クラスを正しく理解し使いこなせるようになることは、Javaエンジニアとしての第一歩と言っても過言ではありません。

本記事では、初心者の方に向けてクラスの意味や役割、具体的な書き方、そして混同しやすいオブジェクトとの違いについて詳しく解説します。

Javaのクラスとは?設計図としての役割

Javaにおけるクラスとは、一言で表現すれば「オブジェクトを作るための設計図」です。

現実世界に例えると、家を建てるための「図面」や、たい焼きを焼くための「型」のようなものだと考えるとイメージしやすいでしょう。

設計図であるクラス自体は、実体(データ)を持ちません。

しかし、その設計図に基づいて「どのようなデータ(属性)を持ち、どのような振る舞い(動作)をするか」を定義します。

Javaのプログラムは、このクラスという設計図を大量に作成し、それらを組み合わせることで複雑なシステムを構築していきます。

クラスを導入する最大のメリットは、プログラムの再利用性とメンテナンス性が向上することにあります。

一度「車」という設計図(クラス)を作ってしまえば、それを利用して「赤い車」「青い車」「高速な車」など、共通の性質を持った実体を効率的に量産できるからです。

クラスとオブジェクト(インスタンス)の違い

クラスを学ぶ上で最も混乱しやすいのが、クラスオブジェクト(あるいはインスタンス)の違いです。

これらの用語は明確に区別して理解する必要があります。

クラスは「型」、オブジェクトは「実体」

前述の通り、クラスはあくまで設計図であり、コンピュータのメモリ上には存在しますが、それ単体で動作するものではありません。

一方で、その設計図を元に生成された具体的な実体が「オブジェクト(インスタンス)」です。

例えば、「人間」というクラスがあったとします。

このクラスには「名前」や「年齢」という項目が定義されています。

しかし、クラスの状態では「誰の名前か」は決まっていません。

このクラスから「名前:田中、年齢:25歳」という具体的な実体を作ったとき、それがオブジェクトとなります。

比較項目クラス (Class)オブジェクト / インスタンス (Object / Instance)
役割設計図、雛形、定義具体的な実体、データそのもの
存在場所ソースコード上コンピュータのメモリ上
個数基本的に1つの定義につき1つ1つのクラスから無数に作成可能
料理のレシピ実際に出来上がった料理

このように、「クラスをメモリ上に実体化させたものがインスタンス(オブジェクト)である」という関係性をしっかり押さえておきましょう。

クラスを構成する2つの主要要素

Javaのクラスは、主に「フィールド」「メソッド」という2つの要素で構成されます。

これらは、オブジェクトの「状態」と「振る舞い」を定義するものです。

1. フィールド(属性・変数)

フィールドは、そのクラスが持つデータ(状態)を保持するための変数です。

例えば「商品クラス」であれば、商品名、価格、在庫数などがフィールドに該当します。

クラスブロックの直下で宣言され、そのクラスから作られたオブジェクトごとに異なる値を保持することができます。

2. メソッド(操作・関数)

メソッドは、そのクラスができること(振る舞い)を定義した処理の集まりです。

「商品クラス」であれば、価格を計算する、在庫を減らす、商品情報を表示するといった動作がメソッドに当たります。

メソッドを呼び出すことで、フィールドの値を書き換えたり、計算結果を返したりすることが可能です。

Javaでのクラスの書き方と基本構造

それでは、実際にJavaでどのようにクラスを記述するのか、基本的な構文を見ていきましょう。

クラス定義の基本構文

Javaでクラスを作成するには、classキーワードを使用します。

Java
// クラスの定義
public class Car {
    // フィールド(属性)の定義
    public String color;
    public int speed;

    // メソッド(振る舞い)の定義
    public void drive() {
        System.out.println(color + "色の車が、時速" + speed + "kmで走ります。");
    }
}

この例では、Carという名前のクラスを作成しています。

この中には2つのフィールド(color, speed)と、1つのメソッド(drive)が含まれています。

アクセス修飾子の重要性

クラスやフィールド、メソッドの先頭にあるpublicなどは「アクセス修飾子」と呼ばれます。

これは、その要素がどこからアクセス可能かを制限するものです。

  • public: どこからでもアクセス可能。
  • private: 同じクラス内からのみアクセス可能。

実務では、フィールドをprivateにして外部から直接書き換えられないようにし、メソッドを通じて操作する「カプセル化」という手法が推奨されます。

コンストラクタ:オブジェクトの初期化

クラスからインスタンスを生成する際に、必ず実行される特殊なメソッドを「コンストラクタ」と呼びます。

コンストラクタの主な役割は、オブジェクトの初期状態を設定することです。

コンストラクタの特徴

  • クラス名と全く同じ名前にする必要がある。
  • 戻り値(voidなど)を指定しない。
  • new演算子でインスタンス化された瞬間に自動的に呼び出される。
Java
public class Car {
    public String color;
    public int speed;

    // コンストラクタ
    public Car(String color, int speed) {
        this.color = color; // 引数の値をフィールドに代入
        this.speed = speed;
    }
}

thisというキーワードは、「自分自身のインスタンス」を指します。

これにより、引数で受け取った値とクラスのフィールドを区別して代入することができます。

実践:クラスの作成からインスタンス化までの流れ

では、実際にクラスを定義し、それを別のクラス(メインプログラム)から呼び出して実行する一連の流れを確認しましょう。

1. クラスの定義 (Employee.java)

まずは「従業員」を表すクラスを作成します。

Java
public class Employee {
    // フィールド
    private String name;
    private String department;

    // コンストラクタ
    public Employee(String name, String department) {
        this.name = name;
        this.department = department;
    }

    // 自己紹介をするメソッド
    public void introduce() {
        System.out.println("名前は" + name + "です。部署は" + department + "に所属しています。");
    }
}

2. インスタンス化と実行 (Main.java)

作成したEmployeeクラスを、プログラムの実行起点であるmainメソッド内で使用します。

Java
public class Main {
    public static void main(String[] args) {
        // Employeeクラスからインスタンス(オブジェクト)を生成
        // new クラス名(引数) の形式で記述する
        Employee emp1 = new Employee("田中太郎", "営業部");
        Employee emp2 = new Employee("佐藤花子", "開発部");

        // メソッドの呼び出し
        emp1.introduce();
        emp2.introduce();
    }
}
実行結果
名前は田中太郎です。部署は営業部に所属しています。
名前は佐藤花子です。部署は開発部に所属しています。

このコードでは、1つのEmployeeという設計図から、emp1emp2という2つの異なる実体(オブジェクト)が作られています。

それぞれのオブジェクトが独自のデータ(名前や部署)を持っていることがわかります。

これがオブジェクト指向プログラミングの基本形です。

クラス設計における重要な命名規則

Javaには、コードの可読性を高めるために広く使われている命名規則があります。

クラスを作成する際は、以下のルールに従うのが一般的です。

アッパーキャメルケース(PascalCase)

クラス名の先頭は大文字で始め、単語の区切りも大文字にします。

(例:UserProfile, DatabaseManager

名詞での命名

クラスは何らかの「もの」を表す設計図であるため、動詞ではなく名詞で名前を付けます。

ファイル名との一致

publicなクラス名は、そのソースコードのファイル名(.java)と完全に一致していなければなりません。

これらのルールを守ることで、他のエンジニアが見た際にも理解しやすい、保守性の高いコードになります。

クラスをより深く理解するための「継承」と「インターフェース」

クラスの基本を理解した後は、Javaのさらに強力な機能である「継承」や「インターフェース」についても知っておくと良いでしょう。

継承 (Inheritance)

継承とは、あるクラスの機能を引き継いで新しいクラスを作ることです。

例えば、「動物」クラスを継承して「犬」クラスや「猫」クラスを作れば、共通の処理(食べる、寝るなど)を重複して書く必要がなくなります。

これを「コードの再利用」と呼びます。

インターフェース (Interface)

インターフェースは、「どのようなメソッドを持つべきか」というルールだけを定義したものです。

クラスが特定のインターフェースを実装(implement)することで、そのクラスが特定の振る舞いを持つことを保証できます。

これらの概念は、クラスという土台の上に成り立っています。

まずはシンプルなクラスを自力で書けるようになることが、複雑な機能をマスターするための近道です。

まとめ

Javaにおけるクラスは、プログラムを構成するための最も重要な設計図です。

フィールドで状態を、メソッドで振る舞いを定義し、それをnew演算子で実体化(インスタンス化)することで、初めてプログラムとして機能するオブジェクトが生まれます。

クラスとオブジェクトの違いを正しく理解することは、Javaだけでなくオブジェクト指向言語全般を習得する上で避けては通れないステップです。

まずは身の回りにあるものをクラスに例えて設計してみることから始めてみてください。

  • クラスは「設計図」、オブジェクトは「実体」。
  • クラスは「フィールド(データ)」と「メソッド(処理)」で構成される。
  • コンストラクタを使って初期状態を決定する。
  • 適切なアクセス修飾子や命名規則を用いることが、プロフェッショナルなコードへの第一歩。

Javaの学習を進める中で、クラスの概念が腑に落ちる瞬間が必ずやってきます。

本記事の内容を参考に、実際に手を動かして様々なクラスを作成し、オブジェクト指向の楽しさを体感してください。