Java OOP概念:基礎、実例、利点を徹底解説
OOPとは
オブジェクト指向プログラミング(OOP)は、抽象化、カプセル化、継承、多態性という4つの核心原則に基づく設計パラダイムです。現実世界のエンティティをオブジェクトとしてモデル化し、それらを操作するメソッドを定義します。目標は、問題領域の構造を反映した再利用可能でモジュール化されたコードを作成することです。
実例で学ぶJavaの主要OOP概念
すべてのJava開発者がマスターすべき基礎概念を以下に示します:
1) クラス
クラスはオブジェクトの青写真(設計図)です。属性(データ)と振る舞い(メソッド)を定義します。例えばCarクラスならmake、model、speedといったプロパティと、drive()、brake()、reverse()といったメソッドを持ちます。このクラスからインスタンス化されるオブジェクト(メルセデス、BMW、トヨタ)はこれら属性と振る舞いを継承します。
2) オブジェクト
オブジェクトはクラスの具象的なインスタンスで、実際のデータと実行可能なメソッドを含みます。具体的なChair、Bike、Penなどが例です。Javaではオブジェクトが状態と振る舞いの両方を保持します。
3) 継承
継承によりサブクラスがスーパークラスのフィールドとメソッドを継承し、親子関係を確立。コード再利用と論理的階層を促進します。例えばSedanクラスがCarから継承し、特化機能を追加できます。
4) 多態性
多態性により単一インターフェースで異なる実装(サブクラス)を表現可能。オーバーライドとメソッドオーバーロードがJavaでの一般的実装です。例えばVehicleインターフェースをCarとTruckが実装し、それぞれ独自のmove()ロジックを提供。
5) 抽象化
抽象化は複雑な実装詳細をシンプルなインターフェースの裏に隠蔽します。車ではユーザーはハンドルとアクセルを操作し、エンジン機構を意識しません。Javaでは抽象クラスとインターフェースで抽象化を実現。
6) カプセル化
カプセル化はデータとメソッドをクラス内に束ね、内部状態への直接アクセスを制限します。フィールドは通常privateとし、publicなゲッター/セッターでアクセス制御。これによりデータ整合性を守り、モジュール設計を支援。
7) 関連
関連は2つのオブジェクトが互いを認識しつつ独立したライフサイクルを持つ関係。例えばStudentが複数のTeacherと関連付けられ、逆もまた然り。
8) 集約
集約は「持っている」関係を示す特殊な関連で、含まれるオブジェクトが独立して存在可能。DepartmentがTeacherオブジェクトを含んでも、部署削除後も教師は存続。
9) コンポジション
コンポジションは強い「持っている」関係で、含まれるオブジェクトの寿命が親に紐づく。Houseオブジェクトが破棄されれば、すべてのRoomオブジェクトも自動的に削除。
JavaにおけるOOPの利点
- 現実世界の概念と整合した明確でモジュール化された構造
- 複数プロジェクト間でのクラス再利用により開発時間短縮
- カプセル化と抽象化による大規模コードベースの保守性向上
- 明確なインターフェースと契約による開発者間コラボレーション改善
他プログラミングパラダイムとの比較:銀行アプリケーション例
JavaのOOPアプローチが非構造化・構造化プログラミングとどう異なるか、deposit(入金)、withdraw(出金)、showBalance(残高表示)機能を持つシンプルな銀行アプリで比較。
非構造化プログラミング
初期言語は線形フローで、操作ごとにコードを繰り返し:
int account_number = 20; int account_balance = 100;
// 入金 100
account_balance = account_balance + 100;
// 残高表示
printf("Account Number=%d", account_number);
printf("Account Balance=%d", account_balance);
// 出金 50
account_balance = account_balance - 50;
// 再表示
printf("Account Number=%d", account_number);
printf("Account Balance=%d", account_balance);
構造化プログラミング
関数/手続きで繰り返しロジックをカプセル化し可読性向上:
void deposit(int amount) { account_balance += amount; }
void withdraw(int amount) { account_balance -= amount; }
void showBalance() {
printf("Account Number=%d", account_number);
printf("Account Balance=%d", account_balance);
}
オブジェクト指向プログラミング(Java)
データと操作をクラスにバンドルし、OOPの全利点を獲得:
public class Account {
private int accountNumber;
private int accountBalance;
public Account(int number, int balance) {
this.accountNumber = number;
this.accountBalance = balance;
}
public void deposit(int amount) { accountBalance += amount; }
public void withdraw(int amount) { accountBalance -= amount; }
public void showBalance() {
System.out.println("Account Number: " + accountNumber);
System.out.println("Account Balance: " + accountBalance);
}
}
データと振る舞いを結合することで、Java OOPは以下を導入:
- 抽象化:ユーザーはシンプルなAPIと対話
- カプセル化:内部状態を保護
- 継承:将来の口座タイプで
Accountを拡張可能 - 多態性:同名メソッドがサブクラスで異なる振る舞い
これら機能が総合的にコードの明確性向上、重複削減、保守簡素化を実現します。



Java
- C#クラスとオブジェクト実践チュートリアル:実例で学ぶオブジェクト指向の基礎
- C# Queue完全ガイド:Enqueue、Dequeue、FIFO操作の実例解説
- Javaシングルトンパターン完全解説:安全な実装と活用法
- OOPにおける抽象化マスター:Java抽象クラス&メソッド完全解説
- Javaカプセル化完全ガイド:実践例で理解するデータ隠蔽とアクセサ
- Java String.indexOf()マスター:部分文字列検索と実践例
- Java String.compareTo()マスター:構文、ユースケース、実践例
- Java コンストラクタオーバーロード完全解説:実践コード例付き
- Javaオブジェクトとクラス:コアOOP概念を完全理解
- Javaオブジェクト直列化: オブジェクトの持続化と復元(Serializable/transient/ObjectOutputStream)
- Javaアプレット入門:基礎と主要な違い