オブジェクト指向のクラスって何ですか?
プログラミング初心者です。
オブジェクト指向の話で、
オブジェクトは概念で、インスタンスは実際に生命を吹き込まれた実体、と習いました。
つまり、
「『人間』はオブジェクトで、『アダム』や『イヴ』、『唐澤貴洋』はインスタンス」という感じです。
しかし、プログラミングの教科書を見ると、
「『人間』はクラス、『アダム』『イヴ』『唐澤貴洋』はオブジェクト」
と呼んでいるようでした。(第2の流派)
「あれ?流派の違い?」と思い、調べてみたら、あるサイトの説明では、
「『人間』はクラス、『アダム』『イヴ』『唐澤貴洋』はインスタンスです。そして、クラスもインスタンスもオブジェクトです。」
と言っていました。(第3の流派)
分かりづらいですが、とりあえず第3の流派を採用しようと思うのですが、
第3の流派における『オブジェクト』とはどういう意味でしょうか?
ご回答よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答10件
0
たとえ話の是非
オブジェクト指向を理解するにあたって、概念をたとえ話として理解するのは、適切ではないです。(多くのたとえ話が破綻しています)
個人的見解ですが、技術をたとえ話で理解するのはエンジニアとして正しい理解に結びつかないです
用語の定義
具体的な技術用語として定義可能なのは「インスタンス」のみで、その他は文脈で判断する必要があります。
オブジェクト指向を理解するということ
それなりの経験をした人が、困った末に困った箇所に対応するための概念がオブジェクト指向です。困っていない間は、なかなか理解できないです。
困ってから理解すると良いです。
簡単に困れるのが「実務」なので経験をあまりショートカットできるものではないです。が、「デザインパターンにある例示」をうまく使えば、擬似的に困れるかも。
投稿2019/03/17 03:21
退会済みユーザー
総合スコア0
0
ベストアンサー
操作対象がオブジェクト(英単語のobjectの意味そのまま)で、オブジェクトを、クラスとの関係の中で考えたものをインスタンスというのが、一般的ではないでしょうか。
(プログラミング言語によっては、効率的な処理のために、数値や文字列などのよく使われる簡単な操作対象を、プリミティブ型等ということで、文法仕様上オブジェクトと別扱いしていますが、それは効率化のための都合で、概念的には気にしなくて良いと思います)
第3の流派における『オブジェクト』とはどういう意味でしょうか?
プログラミング言語によっては、「1が整数クラスのインスタンス」というのと同じく「整数クラスが、クラスクラスのインスタンス」という場合もあるわけで、その場合は、クラスもオブジェクトです。
投稿2019/03/17 03:30
総合スコア84538
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんにちは。
オブジェクトは概念で、インスタンスは実際に生命を吹き込まれた実体、と習いました。
「『人間』はオブジェクトで、『アダム』や『イヴ』、『唐澤貴洋』はインスタンス」という感じです。
う~~ん、豪快な間違いと思います。(「人によって定義が異なる」程度の差ではないです。)
オブジェクト指向の潮流は確かに2つの流れがあります。クラス・ベースのものとプロトタイプ・ベースです。
前者は、設計図としてのクラスがあり、設計図(クラス)を元に作られた実体をインスタンス、もしくは、オブジェクトと呼びます。
後者は、そもそもクラス・ベースの意味の設計図(クラス)は存在せず、クローン(コピー)することでオブジェクトを増やします。なのでクラスやインスタンスという概念を含まないようです。
このどちらの概念に照らし合わせても、オブジェクトからインスタンスが作られるという表現は誤りです。
「『人間』はクラス、『アダム』『イヴ』『唐澤貴洋』はオブジェクト」
これはクラス・ベースの考え方と思います。しかし、間違いではないですが、あまり適切ではないです。人間という設計図があって、それから量産されたものがアダムやイヴではないです。生物は1つ1つの個体が異なる設計図(遺伝子)を持つのでちょっと無理を感じます。
「『人間』はクラス、『アダム』『イヴ』『唐澤貴洋』はインスタンスです。そして、クラスもインスタンスもオブジェクトです。」
こちらもクラス・ベースの考え方と思います。
上記との相違は、オブジェクトという用語の使い方の相違ですね。クラスとインスタンスをひっくるめて呼びたい時にオブジェクトと呼ぶこともあるようです。
因みに、オブジェクトという用語は実に曖昧です。オブジェクト指向プログラミングから離れるとオブジェクト・ファイルとかありますね。更にプログラミングから離れると、英文法で出てくるSVO等のOもオブジェクトですし。
投稿2019/03/17 03:32
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/17 04:33
2019/03/17 06:01
2019/03/17 06:52 編集
2019/03/17 08:01
2019/03/17 08:26
2019/03/19 22:47
2019/03/19 23:08
2019/03/20 00:24
2019/03/20 05:49 編集
2019/03/21 01:54
0
3つとも違う言い方だけど、3つを分けて考える事もないのかと。
3つを別々の流派と考えなくても、クラスベースのオブジェクト指向の説明として3つとも正しいと捉える事が出来ると思います。
(とは言っても、第1の流派に関しては間違いではないですがとても誤解を招きやすい説明の仕方です。第3の流派は私的には初心者にはタブーな部分まで触れてしまっている上に、説明の順番がごちゃごちゃです。第2の流派の説明の仕方が最も適切ではあると思います。)
なぜそんな事が言えるのかと言うと、日本語の「AはB」って言うのが「A∈B」「A⊆B」「A=B」のどの意味でも使われていて、かつ見分けがつきにくく、見分けがついたとしてもまた別の言い方が出来てしまいます。さらにオブジェクト指向の概念では、「AクラスはBクラスを継承している」「AオブジェクトはBクラスのオブジェクトである」と言う意味でも使われます。ややこしいですけどね。
a. 猫は生物
b. 猫は哺乳類
c. うちのタマは猫
この3つの主張を聞いて、3つの流派があるなんて思わないですよね。同じ人がこの3つの主張をしたところでどこも不自然じゃないです。でも、これらを聞いて「結局猫って何?」ってなるのも分かります。質問者様もちょうどそのような感じだと思います。
そこで、混同しないように「は」と言う助詞を使わず形式的にいろいろ言い表してみると、
(クラスは集合として考える事もできます。関数型言語等では型を集合として考えたりもします。ここではその考えに法って考えます。)
定義
A⇨B ⇔ AクラスはBクラスを継承している
A⇀B ⇔ AはBクラスのオブジェクトである
- 猫 ⊆ 生物
- 猫 ⊆ 哺乳類
- うちのタマ ∈ 猫
- 人間クラス ∈ クラス
- 人間 ⇨ オブジェクト
- 唐澤貴洋 ⇀ 人間
- 唐澤貴洋 ⇀ オブジェクト
- オブジェクトクラス ∈ クラス
- オブジェクト = ????(クラス)
- クラス ⊆ ????(オブジェクト)
って感じになると思います。
どれをとっても「"左項" は "右項" である。」と言い表せます。(ちゃんとやるなら哺乳類・人間・唐澤貴洋等の同値関係について定義が必要です。)
「⇨」と「⊆」、「⇀」と「∈」はそれぞれ似た様な意味合いです。
最後の2つは少しだけ集合論の知識が必要ですが、それぞれ「オブジェクトとは、クラスの合併集合」「クラスはオブジェクトの冪集合の部分集合」と言う意味で、クラスベースのオブジェクト指向を理解する上で最も重要だと私は考えています。
Javaとかだとクラスクラスってのがあって、クラスはオブジェクトだとしていますが、これはクラスベースのオブジェクト指向に対して共通の概念ではなく、それこそ一つの流派っていう感じだと思います。この流派に従えば、上記に加え、
- 人間 ⇀ オブジェクト
- クラス ⇨ オブジェクト
- オブジェクト ⇀ オブジェクト
- クラス ∈ クラス
みたいのも成り立ってしまうって事になります。ちなみに第3の流派はこれに従った説明です。
「a∈a」の形は自己言及と呼ばれる論理で、理解するのに苦労する上に矛盾を引き起こしやすいから数学界では忌み嫌われているらしいですが、この論理自体が直ちに矛盾を生じさせる訳ではないので、上記のものと矛盾なく両立できこの流派もきちんと成り立っています。
インスタンスに関しては、オブジェクトとあまり大きな違いはないと捉えてしまっても困ることはないと思います。メモリに確保されるのがインスタンスで、概念上の話をする時はオブジェクトと言う感じで使い分けるのが普通かなと思います。
投稿2019/06/09 22:07
編集2019/06/10 09:01総合スコア143
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/10 00:40 編集
2019/06/10 02:37 編集
2019/06/10 02:41
2019/06/10 02:42
2019/06/10 02:44
2019/06/10 03:05
2019/06/10 03:07
2019/06/10 03:10
2019/06/10 03:13
2019/06/10 03:18
2019/06/10 03:28
2019/06/10 03:29 編集
2019/06/10 03:31 編集
2019/06/10 03:37
2019/06/10 03:38
2019/06/10 03:48
2019/06/10 04:03 編集
2019/06/10 04:07 編集
2019/06/10 04:15
2019/06/10 04:17
2019/06/10 04:21
2019/06/10 04:29
2019/06/10 04:29
2019/06/10 04:32
2019/06/10 04:34
2019/06/10 04:35
2019/06/10 04:43
2019/06/10 04:45
2019/06/10 04:45
2019/06/10 04:48
2019/06/10 04:49
2019/06/10 04:52 編集
2019/06/10 04:56 編集
2019/06/10 04:58
2019/06/10 05:08 編集
2019/06/10 05:29
2019/06/10 05:32
2019/06/10 05:38
2019/06/10 05:46 編集
2019/06/10 05:48
2019/06/10 05:56
2019/06/10 05:56
2019/06/10 05:59 編集
2019/06/10 06:00
2019/06/10 06:12
2019/06/10 06:17
2019/06/10 06:22
2019/06/10 06:24
2019/06/10 06:53
2019/06/10 07:22
2019/06/10 07:42
2019/06/10 07:54
2019/06/10 08:20
2019/06/10 08:21
2019/06/10 08:27
2019/06/10 08:33
2019/06/10 08:39 編集
2019/06/10 08:55 編集
2019/06/10 09:01
2019/06/10 09:11
2019/06/10 09:15
2019/06/10 09:25 編集
2019/06/10 09:26
2019/06/10 09:27
2019/06/10 09:28
2019/06/10 09:29
2019/06/10 09:39
2019/06/10 09:40
2019/06/10 09:49
2019/06/10 09:51 編集
2019/06/10 09:51
2019/06/10 09:51
2019/06/10 09:55
2019/06/10 09:59
2019/06/10 10:01
2019/06/10 10:01
2019/06/10 10:03
0
Object 型
JavaScriptにおいては、オブジェクトとはObject 型の事です。
そして、「クラス」も「インスタンス」も Object 型です。
「例え話」に正解はありません。
正確を期すならば、コードで説明しましょう。
未解決の質問
未解決の質問を一つずつ解決してから、次の質問をしてください。
問題が分からない状態で次の課題に取り組むのは、曖昧な知識の上に曖昧な知識を重ねるだけなので、せっかくの回答も頭に入りません。
Re: WeilSpinor さん
投稿2019/03/17 02:58
編集2019/03/17 02:59総合スコア18162
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
オブジェクト指向は、そのオブジェクト指向プログラミング言語によって解釈が異なっています。そのため言語ごとに異なります。オブジェクト指向の話題がでた場合、どの言語でのオブジェクト指向かということを確認する必要があります。多くの場合Java言語のオブジェクト指向(クラスベースのオブジェクト指向)のことを指していることが多いです
また、C言語のような、非オブジェクト指向言語の場合独自にオブジェクト指向を実装することになるため、実装方法によって異なります。
さてJava等のクラスベースのオブジェクト指向では、クラスは設計図または鋳型、オブジェクトは実体のため第二の流派ということになります。
JavaScriptについてはすでに回答がありますのでそちらを参照してください。
投稿2019/03/17 03:32
総合スコア1088
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
わたしも te2jiさんに同意。
オブジェクト指向ってのが素晴らしいっていうより、考え方です。
参考: 参考1
で、どっちがどっちだったか忘れましたが、サブセットだった気がします。
オブジェクト ⊆ インスタンス
だったか、逆だったかもしれませんが、大体同じ意味で使っていることが多いです。
私の経験(趣味)では
オブジェクト : クラス + インスタンス
インスタンス : クラスから生成したもの
って感じでしょうか。ただ、ほとんどの文脈では object = instance と大差ないことが多いです。
多分、質問の例では "人間" クラスから生成した "アダム", "イブ", "唐澤貴洋" (どちらさん?) という感じになっているはず。
C++で書くと、
C++
1// std::wstring は Javaだと Stringのようなもの。 2// ただし、wchar_t と呼ばれる、ワイド文字列用。 3class Human{ 4 public: 5 Human( const std::wstring &name ) : name_(name){} 6 ~Human(){} 7 std::wstring introduce( void ){ /* ここで自己紹介風で印字 */ } 8 private: 9 std::wstring name_; 10}; 11 12// ここからはmain関数のような呼び出し側だとして 13Human adam( L"アダム" ); 14Human eve( L"イブ" ); 15Human karasawa( L"唐澤貴洋" ); 16adam.introduce(); 17eve.introduce(); 18karasawa.introduce();
のような感じだと思う。
ただ、te2jiさんがおっしゃるように、例え話で説明するのはダメだと思う。
わかったような、わからないような...って感じ。
むしろ、歴史・背景なんかや、「オブジェクト指向じゃない場合とオブジェクト指向の場合ではこんな差がある」という実例を提示したほうがまだわかりやすいかも。
[追記1]
プログラミング初心者なのに生意気を言ってしまい...
いえ、初心者かどうかなんて関係ないです。
意味のある議論なら初心者でもすべきです。
ですが、私が最初に言いたかったものは、
『初心者が勘違いする人が出てくる』
ということです。
確かに、OOPをある程度理解したうえでたとえ話を読むと納得できます。
しかし、初心者には...ちょっと...ね?
私自身の話をすると、
動物クラスを作って、継承していぬクラス、猫クラス...
『ん? で、何がいいんだ?』
っていう風な感じでした。
現実世界のモデリングはできるのでしょうけど、大体の初心者は「これを使って何ができて、何ができないか」を見ています。後は「存在意義」。
しかもそのサイトの書き方が変。
C++
1class Animal{ 2 public: 3 Animal(){} 4 virtual ~Animal(){} 5 void bark( void ){} 6 void eat( void ){} 7 void sleep( void ){} 8}; 9 10class Dog : public Animal{ 11 public: 12 Dog( const std::string &name ) : name_(name){} 13 virtual ~Dog(){} 14 void bark( void ){ cout << "わんわん" << endl; } 15 void eat( void ){ /* 食事中 */ } 16 void sleep( void ){ /* 寝ている... */ } 17 private: 18 std::string name_; 19}; 20 21class Cat : public Animal{ 22 public: 23 Cat( const std::string &name ) : name_(name){} 24 virtual ~Cat(){} 25 void bark( void ){ cout << "にゃー" << endl; } 26 void eat( void ){ /* 食事中 */ } 27 void sleep( void ){ /* 寝ている... */ } 28 private: 29 std::string name_; 30};
みたいに書いておきながら、
呼び出し元は、
C++
1Dog pochi( "ぽち" ); 2Cat tama( "たま" ); 3pochi.bark(); 4tama.bark();
ってやっているのが多い。
それだったら
C++
1Animal *pochi = new Dog( "ぽち" ); 2Animal *tama = new Cat( "たま" ); 3pochi.bark(); 4tama.bark();
っていう風に、「親として保持して、親として動かすときはどのオブジェクトでもできるよ。処理内容はオブジェクト自身が理解していればいいんだよ。」
みたいに書いてあるならまだわかる。
ただドヤ顔で「ほれ見ろ。すごいだろぉ!」って言わんばかりのショーもない例が多い。
だったら中途半端な例よりは歴史背景やそれ以外の説明のほうがわかりやすい...っていう意味で最初に書いたのですが...
ただ、「この例え話だけが唯一の解釈ではない」ということは頭の片隅に置いておくべきだと、自分に言い聞かせています。
確かに。でも初心者はそれどころではないです。
というか、「丸投げして何が悪い」と逆ギレする人まで出る始末だし。
...ん? 私の(本質問に対する)解釈、間違ってます?
投稿2019/03/17 03:45
編集2019/03/21 01:51総合スコア4958
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/19 21:04 編集
2019/03/21 01:29
0
あくまで私の学んだ考え方ですが…。
質問者さんの例えに沿うならば、「クラス」は「人間」で、「オブジェクト」は「アダム」や「イブ」、
「インスタンス」は「オブジェクト」の別名です。
人間には、名前、性別、年齢、身長、体重などの、データがありますよね。
それを「人間」クラスの中に入れるんです。
Javaで表現するならこうなります。
Java
1class Human { 2 String name; // 名前が入ります。 3 String sex; // 性別が入ります。 4 int age; // 年齢が入ります。 5 double height; // 身長が入ります。 6 double weight; // 体重が入ります。 7}
そして、この中に、アダムならばアダムの、イブならイブのデータを入れて使用します。
また、オブジェクト指向言語では、クラスの中にメソッド(関数)を入れることができます。
投稿2019/03/17 03:39
総合スコア37
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
オブジェクトは, 「塊」
クラスは, 「構造(を成す塊)」
インスタンスは, 「構造に沿って作られた塊」
といったイメージでは如何でしょうか.
投稿2019/03/17 03:06
編集2019/03/17 03:08総合スコア12646
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/17 03:52