プログラミングの学習を進めていると、必ずと言っていいほど出てくる言葉が「オブジェクト指向」。
でも、「オブジェクトって何?」「インスタンス?クラス?何が違うの?」と最初は戸惑う人も多いはず。私もその一人です。
この記事では、自分なりに、オブジェクト指向の基本と、よく混乱しやすい用語の違いをまとめてみました。
前提知識:オブジェクト、クラス、インスタンスの違い
まずは、オブジェクト指向を理解する上で不可欠な3つの用語を整理しておきましょう。
用語 | 意味 | 例えるなら |
---|---|---|
クラス | 設計図。どういうデータ(プロパティ)と処理(メソッド)を持つかを定義する | パンのレシピ |
インスタンス | クラスから作られた実体。実際に動くもの | 実際に焼いたパン |
オブジェクト | JavaScriptなどの言語で使われる、データと処理をセットで管理するもの全般 | モノそのもの(インスタンスもオブジェクトの一種) |
JavaScriptでの例
// クラス定義
class Person {
constructor(name) {
this.name = name;
}
greet() {
console.log(`こんにちは、私は${this.name}です`);
}
}
// クラスからインスタンスを作る
const taro = new Person("たろう"); // ← これはインスタンス
// インスタンスはオブジェクトでもある
console.log(typeof taro); // "object"
taro.greet();
ここで Person
はクラス、taro
はそのインスタンス(オブジェクト)です。
オブジェクト指向とは?
一言でいうと:
「モノ(オブジェクト)を中心にプログラムを設計する考え方」
どういうこと?
従来の「手続き型プログラミング」では、データと処理をバラバラに書くスタイルでしたが、「オブジェクト指向」では、それらを一つの“モノ”としてまとめます。
手続き型の例
let name = "たろう";
function greet(n) {
console.log(`こんにちは、私は${n}です`);
}
greet(name);
オブジェクト指向の例
class Person {
constructor(name) {
this.name = name;
}
greet() {
console.log(`こんにちは、私は${this.name}です`);
}
}
const taro = new Person("たろう");
taro.greet();
これにより、「データ」と「そのデータに関する処理」を一緒に管理できるようになります。
オブジェクト指向の三大要素
要素 | 説明 | 例 |
---|---|---|
カプセル化 | データと処理を一つにまとめて管理する | クラス内にプロパティとメソッドを定義 |
継承 | あるクラスの機能を引き継いで別のクラスを作る | class Dog extends Animal |
ポリモーフィズム | 同じ名前のメソッドでも中身を変えて振る舞いを変える |
speak() メソッドがそれぞれのクラスで異なる動作をする |
なぜオブジェクト指向を使うの?
メリット
- 再利用しやすい:クラスを再利用すれば、同じ構造のオブジェクトが簡単に作れる
- 保守しやすい:一箇所を修正すれば他も反映されやすい
- 現実世界に近い設計:人、商品、記録などをそのまま“モノ”として捉えられる
実際の開発でのオブジェクト指向
LaravelやRails、SpringなどのWebフレームワークは、基本的にこの「オブジェクト指向」をベースにしています。
たとえば、LaravelのUser
モデルはクラスであり、Auth::user()
で取得するのはそのインスタンスです。
$user = Auth::user(); // ← Userクラスのインスタンス
$user->name; // ← プロパティ
$user->save(); // ← メソッド
現実の「人」をそのままコードにしたような設計ですね。
まとめ
- オブジェクト指向とは、「モノ」を中心にコードを書くスタイル
- クラス=設計図、インスタンス=実物、オブジェクト=それらを含むモノ全般
- メリットが多く、モダンな開発の基本になる考え方
私なりにまとめてみたのですが、いかがでしょうか?
間違っている箇所、もっと分かりやすい解説や例などありましたら、コメントお待ちしています。