Javaは、オブジェクト指向プログラミング(OOP)をサポートする強力なプログラミング言語です。その中心にあるのが「クラス」と「オブジェクト」です。これらの概念は、Javaプログラミングにおける基本であり、他のOOPの概念(継承、カプセル化、ポリモーフィズムなど)の基盤となっています。このガイドでは、Javaにおけるクラスとオブジェクトの基本的な理解を深め、実際の例を用いてその使用方法を解説します。
クラスとは何か?
クラスは、オブジェクトの設計図です。クラスの中には、オブジェクトの特性を表すフィールド(変数)と、オブジェクトが実行できる操作を表すメソッドが含まれます。クラスはオブジェクトを生成するためのテンプレートであり、1つのクラスから複数のオブジェクトを作成することができます。
class Dog { String name; int age; void bark() { System.out.println(name + " is barking!"); } } public class Main { public static void main(String[] args) { Dog dog1 = new Dog(); dog1.name = "Pochi"; dog1.age = 3; dog1.bark(); // 出力: Pochi is barking! } }
上記の例では、`Dog`というクラスを定義しています。このクラスは2つのフィールド(`name`と`age`)を持ち、`bark`というメソッドで「吠える」動作を表現します。クラスの定義を元にして、`dog1`というオブジェクトを作成し、そのオブジェクトのメソッドを呼び出しています。
オブジェクトとは何か?
オブジェクトは、クラスに基づいて生成される実際のエンティティです。オブジェクトはクラスのインスタンスとも呼ばれ、そのクラスが定義したフィールドやメソッドを具体的に持ち、操作することができます。クラスはあくまでテンプレートであり、オブジェクトはそのテンプレートから実体化されたものです。
class Car { String model; int year; void start() { System.out.println(model + " is starting!"); } } public class Main { public static void main(String[] args) { Car car1 = new Car(); car1.model = "Toyota"; car1.year = 2020; car1.start(); // 出力: Toyota is starting! Car car2 = new Car(); car2.model = "Honda"; car2.year = 2022; car2.start(); // 出力: Honda is starting! } }
この例では、`Car`クラスから2つのオブジェクト(`car1`と`car2`)を作成しています。それぞれのオブジェクトは異なる値を持ち、独自に操作することができます。クラスは共通の構造を提供しますが、オブジェクトはその構造に基づいて個別に存在し、動作します。
コンストラクタの使用
Javaでは、オブジェクトが生成される際にコンストラクタと呼ばれる特殊なメソッドが呼び出されます。コンストラクタはオブジェクトの初期化に使われ、クラス名と同じ名前を持ちます。コンストラクタは、必要に応じてパラメータを受け取り、フィールドの初期値を設定するために利用されます。
class Person { String name; int age; // コンストラクタ Person(String name, int age) { this.name = name; this.age = age; } void introduce() { System.out.println("Hello, my name is " + name + " and I am " + age + " years old."); } } public class Main { public static void main(String[] args) { Person person1 = new Person("Taro", 25); person1.introduce(); // 出力: Hello, my name is Taro and I am 25 years old. Person person2 = new Person("Hanako", 30); person2.introduce(); // 出力: Hello, my name is Hanako and I am 30 years old. } }
この例では、`Person`クラスにコンストラクタを定義しています。コンストラクタは、オブジェクトが生成される際に名前と年齢の初期値を設定しています。このように、コンストラクタを使うことでオブジェクトの初期状態を簡単に指定することができます。
フィールドとメソッドのカプセル化
Javaでは、フィールドとメソッドのアクセス制限を設定することができます。通常、クラスのフィールドを直接操作することは避け、代わりにメソッドを使ってアクセスすることが推奨されます。この技術を「カプセル化」と呼び、データの保護とメンテナンス性の向上に役立ちます。
class BankAccount { private String accountHolder; private double balance; BankAccount(String accountHolder, double initialBalance) { this.accountHolder = accountHolder; this.balance = initialBalance; } public void deposit(double amount) { if (amount > 0) { balance += amount; System.out.println(accountHolder + " deposited " + amount + ". New balance: " + balance); } } public void withdraw(double amount) { if (amount > 0 && amount <= balance) { balance -= amount; System.out.println(accountHolder + " withdrew " + amount + ". New balance: " + balance); } else { System.out.println("Insufficient balance."); } } public double getBalance() { return balance; } } public class Main { public static void main(String[] args) { BankAccount account = new BankAccount("Ken", 1000); account.deposit(500); // 出力: Ken deposited 500. New balance: 1500.0 account.withdraw(200); // 出力: Ken withdrew 200. New balance: 1300.0 account.withdraw(1500); // 出力: Insufficient balance. } }
この例では、`BankAccount`クラスのフィールドを`private`に設定し、直接アクセスできないようにしています。代わりに、`deposit`や`withdraw`といったメソッドを通じてアカウントの操作を行い、データの整合性を保っています。また、現在の残高を取得するために`getBalance`メソッドを提供しています。
まとめ
Javaにおけるクラスとオブジェクトは、オブジェクト指向プログラミングの基礎であり、強力なプログラムの設計を可能にします。クラスは設計図であり、オブジェクトはその具体的なインスタンスです。コンストラクタを使ってオブジェクトを初期化し、カプセル化を用いることでデータの保護と操作の柔軟性を高めることができます。これらの基本概念を理解し、適切に使いこなすことで、Javaプログラムの品質と保守性が向上します。