よくわからないので調べてみた。
参考
インスタンスとオブジェクトの違い | 覚え書き.com
Pythonのオブジェクトとクラスのビジュアルガイド – 全てがオブジェクトであるということ | プログラミング | POSTD
妄想の展開
私は表題の件について違いがわからない。多分コンパイラやインタプリタなどの動作を理解しないと正しい認識が持てない。しかもプログラミング言語ごとに違うかもしれない。1言語のプログラミング言語仕様すら把握できていない私にそんな知識はない。そもそも正確な情報はどうやって調べればいいのか。調べだすと奥が深すぎて話の筋がずれそう。ここでは根拠のない勝手な妄想を展開して終わらせたいと思う。
型とクラス
違いがわからない。たぶんクラスは型の一部で、以下のような包含関係。
- 型
- クラス
要素 | 説明 | コード例 |
---|---|---|
型 | メモリ総量やメンバのアドレス相対位置定義? | malloc(sizeof(int)); , struct Human { int age; char name[16]; }; |
クラス | 状態と振る舞いの定義? | class Human { int age = 16; void Say(){print("私" + age + "歳。");} } |
メモリだけで見ると、クラスは構造体に関数ポインタを入れたものというイメージ。さらに継承などオブジェクト指向の機能もある。
クラスとインスタンスの関係
「クラスが設計図で、インスタンスが制作物」という例えをよく見る。私のイメージでは以下のように解析者
が対象物
を解析して生成物
をつくる。それが事実であるかは知らない。
解析者 | 対象物 | 生成物 | 内容 | C#コード例 |
---|---|---|---|---|
コンパイラ | 静的テキスト(ソースコード) | クラス | class構文を抜き出し構文チェックしたテキスト部分? | class MyClass {} |
プログラム実行エンジン? | クラス | インスタンス | クラスにある定義どおりにメモリを確保したもの? | new MyClass() |
オブジェクトとインスタンス
項目 | 違い |
---|---|
オブジェクト | メモリ実体全般。型やインタフェース自体のメモリ実体まで含む。 |
インスタンス | クラスから生成されたメモリ実体のこと。 |
単語としての意味の違い
「メモリ実体」という意味ではオブジェクトとインスタンスは同じ意味。それぞれの単語の意味が違うから文脈によって使い分けるのだと思う。ところで、この項は前項までの話から文脈が変わった。「プログラマ認識層」から「自然言語認識層」になった。
和訳 | 英語 | 意味 |
---|---|---|
型 | type | 型。種類、様式。 |
オブジェクト | object | 物、物体 |
クラス | class | (共通の性質を有する)部類。同種の集合。 |
インスタンス | instance | 実例、事例 |
「型」から生成されるのは「物」である。「物」は「型」から生成される。
型→<生成>→物
型と物と生成の関係をコンピュータ上で再現したい。メモリ空間上にそれらの概念を用意するとき、Type,Objectという記号で表す(と思う)。Typeはメモリサイズ。ObjectはTypeの通りにメモリ確保された実体。
Type→<生成>→Object
コンピュータ上で再現するときにメモリ空間として扱うのでなく、モノとして捉えて扱いたい。モノには状態と振る舞いの2つがある。それらを備えたものをモノとして扱う。その概念を表す記号をClass,Instanceと呼ぶ(と思う)。Classは状態と振る舞いの定義。InstanceはClassからメモリ確保された実体。
Class→<生成>→Instance
上記3つは人間の認識層からコンピュータのメモリ層になり、オブジェクト指向プログラミング言語層になっている。
型 -> <生成する> -> 物 人の認識層 △ -|--------------------------------------------------- | Type -> <生成する> -> Object メモリ空間層 △ -|--------------------------------------------------- | Class -> <生成する> -> Instance オブジェクト指向層 ------------------------------------------------------
コンピュータを思い通りに制御したい。しかし機械語により2進数値だけで操作することは人間には難しい。できるだけ人間の認識に則った方法で操作できるようにしたい。それがプログラミング言語である。その発展のひとつにオブジェクト指向がある。
プログラマはプログラミング言語の仕様を把握して、やりたいことを実現させる。 PythonやC#など言語によって仕様や書き方が異なる。基本的な構文さえわかっていれば読めるような形が理想的。
型 -> <生成する> -> 物 人の認識層 △ -|--------------------------------------------------- | Type -> <生成する> -> Object メモリ空間層 △ -|--------------------------------------------------- | Class -> <生成する> -> Instance オブジェクト指向層 ------------------------------------------------------ class MyClass(object): pass Pythonプログラマ認識層 c = MyClass() ------------------------------------------------------ class 人の型(object): def 歩く(): print('Walk.') Pythonコード自然言語認識層 人 = 人の型() 人.歩く() # 人が歩く
classや関数名などの「名付け」に失敗すると意味不明になってしまう。
所感
コンパイラ開発者やハードウェア開発者なら、もっと具体性のある認識を持てそう。私は1言語の言語仕様すら把握していないので曖昧。
型とクラス、オブジェクトとインスタンスの違いを理解するには文脈の違いがあることが見えた。各々の文脈について知る必要がありそう。プログラマなら言語仕様。次に言語仕様の設計思想。次にコンパイラ仕様。このように次々と知っていくことで理解できるようになるはず。途方もない。