インスタンス
Instance
オブジェクト指向プログラミングにおいて、「クラス(設計図)」をもとにして、コンピュータのメモリ上に実際に作成された「実体」のこと。設計図から生み出された具体的なデータと振る舞いを持つ個々の存在を指します。
🐾 猫で例えると?
キャットタワーのハンモックに収まり、同じような体勢でこちらを見つめるアメショと茶トラ。彼らはどちらも「猫(クラス)」という共通の設計図から生まれていますが、毛色や性格(プロパティ)は全く異なる別々の存在です。一方はツンデレで一方は甘えん坊といったように、個別のデータを持った実体としてこの世界(メモリ上)に存在している状態が「インスタンス」です。
🐾猫あるある:IT現場の日常
- 設計図から生まれた実在する固有の個体:定義されたクラス(設計図)を元に、コンピュータのメモリ上に実体として生成されたオブジェクト。
- 同じ種類でもそれぞれ性格や状態が違う:共通の型から生成された複数のオブジェクトが、それぞれ異なる独自の内部データ(プロパティ)を保持している状態。
- 生活空間のリソースを占有して寛ぐ:オブジェクト指向プログラミングにおいて、実行時にメモリ領域を確保して実際に動作しているシステム構成要素。
💻 アプリ・Web開発における「インスタンス」とは?
現代のプログラミング(特にJava、C#、TypeScriptなどのオブジェクト指向言語)では、プログラムを「モノ(オブジェクト)」の集まりとして組み立てていきます。その際、毎回ゼロからモノを作るのは非効率なので、まずは「クラス」という設計図を書きます。
しかし、設計図はあくまで設計図であり、それだけでは動きません。プログラムを実行する際、その設計図をもとに new などのキーワードを使ってメモリ上に領域を確保し、実際のデータを流し込んで使える状態にしたものが「インスタンス」です。1つの「猫」クラスから、「アメショ」インスタンスや「茶トラ」インスタンスなど、いくつでも実体を生成(インスタンス化)することができます。
⚠️ インスタンスの仕組みと注意点
インスタンスを扱う上で最も注意すべきなのは、「それぞれが独立した状態(データ)を持っている」ということです。同じクラスから作られても、一方のインスタンスのデータを書き換えたからといって、もう一方のデータまで変わるわけではありません。
TypeScriptでのインスタンス生成イメージ
実際にクラスを定義し、そこから異なる特徴を持つインスタンスを生み出すコードの例です。
// TypeScriptでの例
// 1. まず「猫」という設計図(クラス)を定義する
class Cat {
name: string;
personality: string;
constructor(name: string, personality: string) {
this.name = name;
this.personality = personality;
}
// 共通の振る舞い(メソッド)
greet() {
console.log(`${this.name}は${this.personality}な性格です。`);
}
}
// 2. 設計図をもとに、実体(インスタンス)を生成する
const amesho = new Cat("アメショ", "ツンデレで特定の女性が好き");
const chatora = new Cat("茶トラ", "愛嬌たっぷりで誰にでもお腹を見せる");
// それぞれ独立したインスタンスとして振る舞う
amesho.greet(); // 出力: アメショはツンデレで特定の女性が好きな性格です。
chatora.greet(); // 出力: 茶トラは愛嬌たっぷりで誰にでもお腹を見せる性格です。 このように、同じ Cat クラスから生成されても、amesho と chatora は別々のメモリ領域に存在する独立したインスタンスです。そのため、茶トラがお腹を見せている間に、アメショが遠くから怖い顔でこちらを見ているといった、全く異なる状態を同時に保持することができます。
🛠️ インスタンスを賢く使うためのポイント
開発現場でインスタンスを扱う際の設計上のポイントや、パフォーマンスに関する注意点です。
- メモリの使いすぎに注意: インスタンスを生成するたびにメモリを消費します。不要になったインスタンスは適切に破棄(ガベージコレクションの対象にする)されるように、参照を切り離す設計が重要です。
- シングルトンパターンの活用: 「データベースへの接続管理」など、システム全体で1つだけ存在してほしい実体の場合、何度呼ばれても同じインスタンスを返す「シングルトン(Singleton)」というデザインパターンを利用します。
- クラス設計の粒度: 何でもかんでも詰め込んだ巨大な設計図(神クラス)を作ってしまうと、そこから生まれるインスタンスも重く扱いづらくなります。責務ごとに小さなクラスに分割するのがベストプラクティスです。
同じハンモックという入れ物(メモリ)に収まりながらも、それぞれ強烈な個性(プロパティ)を放つアメショと茶トラ。オブジェクト指向の世界でも、この「設計図は同じでも、実体は別々」という感覚を掴むことが、優秀なエンジニアへの第一歩になります。