Javaの基礎:オブジェクト指向の基本概念をわかりやすく解説
Javaのオブジェクト指向を学ぼう!
はじめに
Javaを学び始めると必ず耳にする「オブジェクト指向」。オブジェクト指向を理解すれば、Javaプログラミングがもっと楽しくなります!最初は難しく感じるかもしれませんが、基本を押さえればきっと大丈夫です。
本記事では、以下の3つのキーワードを中心にオブジェクト指向を解説します。
- クラスとオブジェクト
- カプセル化
- 継承とポリモーフィズム
最後に簡単な実践例を交え、オブジェクト指向の理解を深めます。ぜひ最後までお読みください!
1. クラスとオブジェクト
クラスとは何か?
クラスは、設計図のようなものです。
例えば、コーヒーショップでは、コーヒーをメニューに登録し、それぞれの種類に名前や値段が設定されています。プログラムの世界では、「コーヒー」という設計図(クラス)を使って、ラテやエスプレッソといった具体的なコーヒー(オブジェクト)を作り出すイメージです。
// コーヒークラスの定義
class Coffee {
String name; // コーヒーの名前
double price; // 値段
// コーヒーの情報を表示するメソッド
void displayInfo() {
System.out.println(name + ": ¥" + price);
}
}
オブジェクトとは何か?
オブジェクトは、クラスを基に作られる「実体」です。
ここでは、具体的なコーヒーがオブジェクトにあたります。
class Main {
public static void main(String[] args) {
// コーヒーオブジェクトを生成
Coffee latte = new Coffee();
latte.name = "ラテ";
latte.price = 400;
Coffee espresso = new Coffee();
espresso.name = "エスプレッソ";
espresso.price = 300;
// コーヒー情報を表示
latte.displayInfo();
espresso.displayInfo();
}
}
出力例:
ラテ: ¥400
エスプレッソ: ¥300
クラスとオブジェクトの違い、理解できたでしょうか?
今度は、あなたの身近な例でも考えてみましょう!
2. カプセル化
カプセル化は、「データを外部から隠し、安全に操作する」仕組みです。Javaでは、アクセス修飾子(private
, public
など)を使ってカプセル化を実現します。
今回の例えでは、コーヒーショップで注文を受ける際、お客様は「コーヒー名」と「数量」を伝えます。しかし、注文の計算ロジックを直接操作されると困りますよね?そこで、「計算は内部で行い、外から触れる部分は最低限にする」工夫がカプセル化なんです。
改善前の問題
以下の例では、価格計算のロジックが外部に公開されると、無効な値が入力される可能性があります。
class Order {
public String coffeeName;
public int quantity;
public double price;
// 合計金額を計算するメソッド
public double calculateTotal() {
return quantity * price;
}
}
この設計では、直接price
に負の値を設定されるリスクがあるので…
改善方法
フィールドをprivate
で隠し、適切なメソッドを通じて値を操作します。
class Order {
private String coffeeName;
private int quantity;
private double price;
// コンストラクタで注文を初期化
public Order(String coffeeName, int quantity, double price) {
this.coffeeName = coffeeName;
setQuantity(quantity);
setPrice(price);
}
// 数量を設定(0以上のみ許可)
public void setQuantity(int quantity) {
if (quantity > 0) {
this.quantity = quantity;
} else {
System.out.println("数量は1以上で指定してください。");
}
}
// 価格を設定(0以上のみ許可)
public void setPrice(double price) {
if (price > 0) {
this.price = price;
} else {
System.out.println("価格は0以上で指定してください。");
}
}
// 合計金額を計算
public double calculateTotal() {
return quantity * price;
}
// 注文の詳細を表示
public void displayOrder() {
System.out.println(coffeeName + " × " + quantity + " : ¥" + calculateTotal());
}
}
public class Main {
public static void main(String[] args) {
Order order = new Order("ラテ", 2, 400);
order.displayOrder();
}
}
出力例:
ラテ × 2 : ¥800
3. 継承とポリモーフィズム
継承
継承は、「既存のクラスを基に新しいクラスを作る」仕組みです。
コーヒーショップには、普通のお客様と割引を受けられる会員のお客様がいますよね。この違いをプログラムで表現するのが「継承」と「ポリモーフィズム」です。
継承: 共通の機能を持つ親クラス
すべての顧客に共通の機能(名前や料金の計算)をCustomer
クラスとして定義します。
// 顧客クラス
class Customer {
protected String name;
public Customer(String name) {
this.name = name;
}
public double calculatePrice(double basePrice) {
return basePrice; // 通常料金
}
public void displayInfo(double basePrice) {
System.out.println(name + "の料金: ¥" + calculatePrice(basePrice));
}
}
子クラス: 特定の顧客タイプを表現
メンバーシップ割引を適用する顧客は、Customer
を継承して作ります。
// 会員クラス
class MemberCustomer extends Customer {
public MemberCustomer(String name) {
super(name);
}
@Override
public double calculatePrice(double basePrice) {
return basePrice * 0.9; // 10%割引
}
}
使用例
public class Main {
public static void main(String[] args) {
Customer regular = new Customer("通常顧客");
Customer member = new MemberCustomer("会員顧客");
double basePrice = 400;
regular.displayInfo(basePrice);
member.displayInfo(basePrice);
}
}
出力例:
通常顧客の料金: ¥400
会員顧客の料金: ¥360
継承とポリモーフィズムを使うと、コードを簡潔に再利用できます!
最後に
本記事では、オブジェクト指向の基本概念について紹介させていただきました。
- クラスとオブジェクト:設計図(クラス)と具体的な実体(オブジェクト)。
- カプセル化:内部ロジックを隠し、安全にデータを操作。
- 継承とポリモーフィズム:共通の機能を親クラスに定義し、子クラスで振る舞いを拡張。
オブジェクト指向を理解することで、現実の問題をプログラムで解決しやすくなります。ぜひ、身近な例を使ってコードを書いてみてください!
Discussion