インスタンス
Instance
オブジェクト指向プログラミングにおいて、「クラス(設計図)」をもとにして、コンピュータのメモリ上に実際に作成された「実体」のこと。設計図から生み出された具体的なデータと振る舞いを持つ個々の存在を指します。
🐾 猫で例えると?
キャットタワーのハンモックに収まり、同じような体勢でこちらを見つめるアメショと茶トラ。彼らはどちらも「猫(クラス)」という共通の設計図から生まれていますが、毛色や性格(プロパティ)は全く異なる別々の存在です。一方はツンデレで一方は甘えん坊といったように、個別のデータを持った実体としてこの世界(メモリ上)に存在している状態が「インスタンス」です。
💻 アプリ・Web開発における「インスタンス」とは?
現代のプログラミング(特にJava、C#、TypeScriptなどのオブジェクト指向言語)では、プログラムを「モノ(オブジェクト)」の集まりとして組み立てていきます。その際、毎回ゼロからモノを作るのは非効率なので、まずは「クラス」という設計図を書きます。
クラスからnewなどで個体を作り、初期値を与えたものがインスタンスです。クラス自体にstaticな機能を持てる言語もあるため、「クラスだけでは何も動かない」という意味ではありません。ここでは個々の猫の状態を持たせる場面に注目します。
⚠️ インスタンスの仕組みと注意点
インスタンスごとのプロパティは、それぞれ別の値を保持できます。ただし、同じ外部オブジェクトを両方へ渡した場合や、staticなデータを使う場合には状態を共有することもあります。「newすれば内部のすべてが独立する」とは限りません。
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(); // 出力: 茶トラは愛嬌たっぷりで誰にでもお腹を見せる性格です。 ameshoとchatoraは別のインスタンスです。一方、const anotherName = ameshoと代入しただけなら、anotherNameは同じ個体を指す別名になります。JavaScriptやTypeScriptでは、変数をコピーすることとインスタンスを複製することを区別します。
🛠️ インスタンスを賢く使うためのポイント
開発現場でインスタンスを扱う際の設計上のポイントや、パフォーマンスに関する注意点です。
- メモリの使いすぎに注意: インスタンスを生成するたびにメモリを消費します。不要になったインスタンスは適切に破棄(ガベージコレクションの対象にする)されるように、参照を切り離す設計が重要です。
- 共有範囲を明確にする: 一つのインスタンスを共有すると便利な場合もありますが、テストや並列処理で状態が混ざることがあります。DB接続では接続プールなど、その資源に合う管理方法を検討し、何でもシングルトンにしないようにします。
- クラス設計の粒度: 何でもかんでも詰め込んだ巨大な設計図(神クラス)を作ってしまうと、そこから生まれるインスタンスも重く扱いづらくなります。変更する理由が異なる処理を分けるなど、責務が混在していないかを見直します。分割後の依存関係も確認しましょう。
同じ猫でも茶トラとアメショが別々の個体であるように、同じクラスから作ったインスタンスも別の実体です。一方を変更したときに他方まで変わるなら、共有しているデータや参照がないかを確認すると、設計の理解が深まります。