Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaのクラスとオブジェクトの使い方を徹底解説!基本から実例まで

Javaにおける「クラス」とは何を意味するのでしょうか?学校の「クラス(学級)」のように生徒や先生がいるものではありません。プログラミングにおけるクラスとは、コード内のオブジェクトを作成するための設計図(ブループリント)のことです。

Javaはオブジェクト指向プログラミング言語です。つまり、再利用可能なコードを書くためのさまざまな機能が備わっています。オブジェクト指向プログラミングは、繰り返しを減らし、コードの可読性を高めてくれるため、小規模から大規模まであらゆるプログラムで役立ちます。

このガイドでは、Javaにおける2つの重要な概念である「クラス」と「オブジェクト」について解説します。それぞれの仕組みと実装方法を、実際のコード例とともに見ていきましょう。

Javaのクラスとは?

クラスは、オブジェクトの設計図のようなものです。寝室の設計図にドアや窓の種類が記されているように、クラスはプログラムに対して、オブジェクトがアクセス・保持できるメソッドや値を定義します。

クラスが便利なのは、特定のデータ型の構造を一度宣言しておけば、オブジェクトを宣言することで何度でも参照できる点です。

それでは、1つの変数と2つのメソッドを持つ「Employee(従業員)」というクラスを定義してみましょう。

public class Employee {
	boolean isOnVacation;

	public void startVacation() {
		isOnVacation = true;
		System.out.println("休暇を開始しました。");
	}

	public void endVacation() {
		isOnVacation = false;
		System.out.println("休暇は終了しました。");
	}
}

このコードでは、従業員の休暇を開始するメソッドと、休暇を終了するメソッドの2つを定義しています。また、この状態を追跡するために、isOnVacation というboolean型のインスタンス変数を宣言しています。

まだEmployeeクラスのオブジェクトは作成していません。ここで定義したのは設計図のみであり、後ほどこの設計図をもとにオブジェクトがどのような形になるかが決まります。

Javaのオブジェクトとは?

オブジェクトとは、特定のクラスのインスタンスのことです。先ほどのEmployeeという設計図を使って、オブジェクトを作成してみましょう。ここでは「john」というオブジェクトを作成します。

Employee john = new Employee();

このコードは、Employeeクラスのインスタンスを生成します。クラス名の後に括弧 () が付いていることに注目してください。これはEmployeeクラスを参照することを示しています。また、new キーワードは、そのクラスの新しいオブジェクトを作成するようコードに指示します。

次に、このオブジェクトのメソッドを使ってみましょう。

Employee john = new Employee();
john.startVacation();
john.endVacation();

プログラムを実行すると、次のような結果になります。

休暇を開始しました。
休暇は終了しました。

オブジェクトが、Employeeクラスで定義した2つのメソッドを呼び出し、その中のコードが実行されます。たとえば john.startVacation() を実行すると、isOnVacation の値がtrueに設定され、「休暇を開始しました。」というメッセージがJavaコンソールに出力されます。

isOnVacation 変数はクラス内で定義されていますが、特定のオブジェクトに割り当てられた値にもアクセスできます。次のコードを見てみましょう。

Employee john = new Employee();
john.startVacation();
john.endVacation();
System.out.println(john.isOnVacation);

このコードは、前の例と同様にJohnの休暇を開始・終了した後、isOnVacation 変数の値をコンソールに出力します。

休暇を開始しました。
休暇は終了しました。
false

isOnVacation の値は false になっています。

Javaのコンストラクタ

コンストラクタ(構築子)メソッドを使用すると、クラス内のデータを初期化できます。上記の例では、クラス本体の中で変数を宣言しましたが、デフォルト値で初期化してはいませんでした。

次のコードを見てください。

class Employee {
	boolean isOnVacation;

	public Employee() {
		isOnVacation = false;
		System.out.println("値を初期化しました。");
	}

	...
}

それでは、Employeeクラスのオブジェクトを作成してみましょう。

Employee john = new Employee();
john.startVacation();

john オブジェクトを作成すると、コンストラクタが自動的に実行されます。コンストラクタを使うことで、クラスに持たせたいデフォルト値を設定できます。実行結果は次のとおりです。

値を初期化しました。
休暇を開始しました。

実行されると、コンストラクタはまず isOnVacation の値をfalseに設定し、その後「値を初期化しました。」をコンソールに出力します。

複数のオブジェクトを作成する

従業員が2人いた場合はどうでしょうか?同じクラスを使い回せるのでしょうか?答えは「はい」です。これこそがクラスを使うメリットです。同じクラスから複数のオブジェクトを宣言できます。

次のメインプログラムを見てみましょう。

Employee john = new Employee();
john.startVacation();
john.endVacation();
System.out.println(john.isOnVacation);

Employee ian = new Employee();
ian.startVacation();
System.out.println(ian.isOnVacation);

コードを実行すると、次の結果になります。

値を初期化しました。
休暇を開始しました。
休暇は終了しました。
false
  
値を初期化しました。
休暇を開始しました。
true

ここでは、Employeeクラスの2つのオブジェクト(johnian)を作成しました。まずJohnの休暇を開始して終了し、その後Ian用のオブジェクトを作成して休暇を開始しています。

john.isOnVacation の値を出力するとfalseが返され、Ianのオブジェクトで同じことをするとtrueが返されます。これは、クラスの各オブジェクトが互いに独立しているためです。同じ設計図を使っていても、それぞれが独自の値を保持できるのです。

まとめ

クラスとオブジェクトは、オブジェクト指向プログラミングの要となる存在です。クラスで設計図を定義し、その設計図をもとにオブジェクトを自由に生成できます。

さて、理解度を試す挑戦課題です。「生徒がテストに合格したかどうか」の情報を管理するクラスを使ったプログラムを作成してみてください。要件は以下のとおりです。

  • 生徒がテストに合格したかどうかを記録する変数を用意する。
  • 合格状態を切り替える2つのメソッドを実装する。
  • 応用編として、if文を使い、数値の成績に基づいて合否を自動判定する処理を追加してもよい。

これであなたも、Javaのクラスとオブジェクトをプロのように扱えるようになりました!

  1. Javaでサブパッケージを使う方法とは?コンパイルからインポートまで徹底解説

    Javaのサブパッケージとは Javaにおけるサブパッケージは、ファイルシステム上のサブディレクトリとよく似た仕組みです。パッケージを階層的に整理することで、多数のクラスやインターフェースを効率よく管理できるようになります。 例として、com.apple.computers というパッケージに Dell.java というソースファイルが含まれている場合、そのファイルは次のような一連のサブディレクトリの中に配置されます。 ....\com\apple\computers\Dell.java コンパイル時の出力ファイルの仕組み コンパイルを実行すると、コンパイラはソースファイル内で定義されているク

  2. Javaで他のパッケージのクラスを使用する3つの方法

    Javaで他のパッケージのクラスを利用する方法 Javaでは、関連するクラスをパッケージにまとめることでコードを整理できます。ここでは、payrollパッケージ内に定義されたBossクラスを例に、別のパッケージにあるクラスを利用する方法を解説します。 package payroll; public class Boss { public void payEmployee(Employee e) { e.mailCheck(); } } 上記のコードは、BossクラスとEmployeeクラスが同じpayrollパッケージに存在する場合の例です。しかし、もしEmpl