質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.80%

インスタンス化とは、言い換えれば、メモリ領域の確保を自動化するようなもの?

解決済

回答 7

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 4,139

score 162

インスタンス化」という手順を取る理由の一つとして「効率的にオブジェクトを作成する為」といわれております。

しかし、コンピューター側(メモリ側)から視点で言い換えると、インスタンス化とは「メモリ領域の確保を効率良く、自動(?)でやってくれる」というイメージの解釈で良いのでしょうか?

お手数ですが回答の方、お願いします。


(訂正)
すいません。質問文の中に

>(メモリ内における)「非オブジェクト指向」と「オブジェクト指向」との違いとしては(イメージ的に言うと)

>非オブジェクト指向⇒「データ」「処理(メソッド)」領域が、ごちゃごちゃに確保される。

>オブジェクト指向⇒「データ」「処理(メソッド)」領域が一つにまとめられて、インスタンス時に半自動(?)で領域が確保される。その為、効率良く、大量に確保できる。

>↑イメージとしては上記のような考えで良いのでしょうか?

という質問内容がありましたが、私自身の誤りでしたので、上記の文は削除しました。

(訂正内容)
この質問内容は「インスタンス化という手順を取る一つとして「効率的にオブジェクトを作成する為」といわれておりますが、コンピューター側(メモリ側)から見てみると、インスタンス化とは(言い換えると)「メモリ領域の確保を効率良く、自動(?)でやってくれるというイメージの解釈」で良いのでしょうか?」

という質問です。「非オブジェクト指向」と「オブジェクト指向」及び「オブジェクト」は関係ありませんでした。申し訳ありません。
  
お手数ですが、回答お願いいたします。


(追記)追記です。「スッキリわかるJava入門」「Javaのオブジェクト指向がゼッタイにわかる本」の書籍にもこのような内容は掲載されていましたよ。

スッキリわかるJava入門」P301に掲載

 なぜJavaでは「オブジェクト同士が連携する仮想世界」を作るために、わざわざ「クラスを定義して、そのクラスからオブジェクトを生成する」という複雑な手順を踏まなけれぱならないのでしょうか。
その答えに辿り着くために、私たちは「オブジェクトを大量に作る必要がある状況」を想像しなけれぱなりません。

 たとえば銀行で「すべての口座情報の複雑な統計を計算するプログラム」が動くとき、その仮想世界には何個の「口座」オブジェクトが必要でしょうか?
口座が1000あるなら1000個のオブジェクトを生み出す必要があるかもしれません。その1000個の口座オブジェクトそれぞれに対して、「属性として、残高・名義人・開設日があって・・・」という定義を繰り返す必要があるとしたら。それを作るプログラマの作業は膨人なものになります。

 そこでクラスの登場です。「属性として、残高・名義人・開設日があって・‥」という定義をした「口座クラス」を1度作っておけぱ、このクラスから100個でも1000
個でも必要な数だけオブジェクトを生み出すことができるのです。たとえぱ振り込みを受け付ける「Uketsukeクラス」を1つ準備しておけぱ、複数の受付係を生み出して、「並行して振り込み依頼を受け付ける」プログラムを作ることもできます

「Javaのオブジェクト指向がゼッタイにわかる本」のP95に掲載

オブジェクト指向プログラミングでは、オブジェクトが基本になるのでした。そのオブジェクトはいきなり作成するのではなく、まずはオブジェクトの設計図であるクラスを記述して、その設計図を元にオブジェクトを生成していくというステップを踏むようになっています。なぜそのような面倒なステップを踏むようになっているのでしょうか?

それは、この題目のように、1つのプログラムの中に同じ種類のオブジェクトが登場するケースはソフトウェア開発の現場でもよく登場します。その際、各オブジェクトを1つ1つゼロから作成していくのはとても非効率でしょう。
コピー&ペーストを繰り返すのもミスを生みかねません。
それよりも、最初にそのオブジェクトの設計図を描いて(クラスを定義して)、その設計図を元に同じ種類のオブジェクトを”大量生産”していった方が効率的です。一度クラスを定義してしまえば、同じ種類のオブジェクトをいくつでも簡単に作り出せるのです。
 そして、同じ種類のオブジェクトがもっと必要になったら、その都度設計図から、また新たにオブジェクトを”大量生産”して作成していけばよいのです。このようにクラスという仕組みを用いることで、プログラムの再利用が高まるというわけです。

後、オブジェクト指向プログラミング OOP(Object Oriented Programming)の基本的な仕組み – Device Configurationのサイトにも以下の内容が掲載されていました。

変数領域の複製は実行時に幾つでも作ることができる。(インスタンスを作ることで、必要な数だけ変数領域を作ることができる)

回答の方よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Q71

    2019/12/19 06:47

    C でいうところの
    int i,j,k,l;
    となにが違うの?
    あるいは、アセンブラをやった事がありますか。

    キャンセル

回答 7

+6

メモリ確保の話と、オブジェクト指向・非オブジェクト指向の違いの話は、全く関連がありません。

読んでない本ですが、こういうのを見てみたらどうでしょうか。
プログラムはなぜ動くのか 第2版

オブジェクト指向・非オブジェクト指向というのは、「プログラムの書き方(設計の仕方)」の話であって、メモリの確保のような「プログラムの動き方」とは関係ないです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

オブジェクトのコンストラクタが「オブジェクトが正常に動くように正しく必要な情報をセットアップしてくれる」ものであり、デストラクタが「オブジェクトが使った資源をすべて正しく返却した状態にする」という意味でなら効率よく自動でやっている、と言えるかも知れませんが、その程度です。

確保する際に使用する実メモリ量で言えば、クラスのインスタンスの方が(クラスに関する情報分の)オーバーヘッドがある分多くなるので非効率かも知れません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

追記

『スッキリわかるJava入門』

なぜJavaでは「オブジェクト同士が連携する仮想世界」を作るために、わざわざ「クラスを定義して、そのクラスからオブジェクトを生成する」という複雑な手順を踏まなけれぱならないのでしょうか。

おそらく、BASICあたりからいきなりJavaに飛んでこられたのでしょうか。
質問はオブジェクト指向ですが、オブジェクト指向が言われる前には「構造化しよう」と言われていました。プログラムコードの作りも構造化しますが、扱う情報も構造化します。BASICでは情報を「意味のある塊」にすることはできませんが、例えばCでは、structを使って意味のある塊、すなわち構造体を作ることができます。ということは、オブジェクト指向言語ではないCでも、「わざわざ「構造体を定義して、その構造体にメモリを割り当てる」という複雑な手順を踏」んでいるわけです。
引用部分は、もうちょっとプログラミング言語の歴史を知っていれば、違う書き方をされたのではないかと思われます。
興味があれば「プログラミング言語 歴史」で検索してみて下さい。

『Javaのオブジェクト指向がゼッタイにわかる本』も、同じですね。

BASICでは、構造体を作れないので、意味のある情報の塊の管理は工夫します。はて?ダンジョン探索型RPGを作ったはずなんだけど、どうやって管理したのだろう?
数値であれば、配列を使います。インデックス0にHP、1にMP、というように。なので、「オブジェクトを大量作る」ことよりも、「オブジェクトの意味的な塊ごとに管理する」ことの方が重要ですし、苦労します。あえて言いますが、「インスタンス化によってオブジェクトを作ることを簡略化する」というのは、間違いです。クラス化することで情報と、それを扱う操作をひとまとめにして、オブジェクトの管理を簡略化します。情報の塊の設計図であるクラスを元に、実態の一つであるインスタンスを生成します。インスタンス化も、やはり管理です。「意味のある塊」と、再三書いています。RPGで、モンスターAと、モンスターBが出てきました。プレイヤーはMORLISを唱え、モンスターAには効きました。モンスターAは一定時間怯え、攻撃をしてこなくなり、アーマークラスが上がります。オブジェクトを使うのが楽なので、昔どうやっていたか忘れてしまいましたが、インスタンスによってモンスターAとモンスターBは、全く別のメモリ空間が割り当てられています。クラスに定義したインスタンスメソッドは、インスタンス内の変数領域に対して作用するので、モンスターAのアーマークラスを上げようとしてモンスターBを変えてしまうと言うことはありません。
メモリ割り当てが自動化するとか、楽になるとかということはありません。しかし、クラス化によって情報がまとまることで管理しやすくなり、インスタンスが分かれることで変更が楽になります。
あ、MORLISは、Wizardlyというゲームに出てくる呪文です。


まず、object, oriented, class, instance の意味を調べましょう。
object:
(感情、動作などの)対象(となるもの)
(行為などの直接の)目標、目的
oriented:
(知的・情緒的に)方向づけられた、…志向の、…本位の、…を重視する
class:
(人、動物、物の)種類、部類
instance:
(論拠となる)例、実例、例証
(ジーニアス英和辞典第5版より)

クラスに基づいて生成されるオブジェクトのことを「インスタンス」といいます

はい。

インスタンスの概念の意味の一つとして「効率的にオブジェクトを作成する為」と言われております

どこで、誰が、このように言っていますか。
どちらかというと、値と操作をまとめ、1つのインスタンスとして扱えるようにするクラスこそ、効率的にオブジェクトを作成していると思います。

コンピューター側(メモリ側)から見てみると、インスタンス化とは(言い換えると)「メモリ領域の確保を効率よく、自動(?)でやってくれるというイメージの解釈」

おかしな言い回しですね。
コンピュータ(OS)が、メモリ領域をプロセスに与えているのですから、コンピュータから見て「自動でやってくれる」というのは、大変おかしく感じます。
例、実例という語から考えると、「メモリ確保」云々よりも、コンストラクターが自動的に呼ばれる方に意味があると考えます。
「なんだ、ただのmallocじゃん。」ではなく、malloc した後、さらに初期化まで実行されます。
例えば、C と C++ を比較しましょう。

// C
typedef struct tag_MyClass1
{
    int a;
    char b[100];
} MyClass1;

MyClass1* varC = (MyClass1*)malloc(sizeof(MyClass1));  // メモリ確保
varC->a = 0;  // 初期化
varC->b = { 0 };  // 初期化
free(varC);  // 解放

// C++
class MyClass2
{
private:
    int a;
    char b[100];
public:
    MyClass2()
    {
        // 初期化
        a = 0;
        b = { 0 };
    }
}

MyClass2 varCpp1;  // 自動変数でインスタンス化→スコープを外れれば解放される
MyClass2* varCpp2 = new MyClass2();  // インスタンス化
delete varCpp2; // 解放

`
C では、malloc 直後の varC は、どのような内容になっているか保証されません。まぁ、初回実行時は大抵0で埋まっていますが。
もっとも、一部のコンパイラは、デバッグ構成では0以外の値で埋め、初期化不足を気づかせてくれます。
従って、malloc 直後では「MyClass1 の例です」とはいえません。初期化の後でようやく「例」といえます。
対して、C++ の varCpp は、どちらも1行で初期化が完了しており、「MyClass2 の例です」といえます。
これがただのメモリ確保とインスタンス化の違いです。
ということで、様々な解説書に書いてあるのは、「メモリ領域の確保を自動でやってくれる」ではなく、「メモリ領域の確保だけでなく、初期化も自動でやってくれる」ではなかったでしょうか。
この、「コンストラクターが呼ばれる」ことで「メモリ確保に時間がかかる」と評価し、「C++は使えない」と判断する人もいました。

Object Oriented Design オブジェクト"しこう"設計は、オブジェクトの方を向いていれば(指向)いいというものではありません。
オブジェクトが何の為に必要か、何を表すのか、何ができるのか、何をしなければならないのかなど、それぞれの目的や使い方を考える、つまり志向して設計します。決してメモリがどうこうというものではありません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+2

「インスタンス化」という手順を取る理由の一つとして「効率的にオブジェクトを作成する為」といわれております。

その表現は初耳だったので、まずはググってみました。

初心者向けに徹底解説!オブジェクト指向とは?
https://eng-entrance.com › プログラミング入門
2019/11/21 - そうならないために、「車」というモノをはじめから定義しておいて、それを使ったほうが楽だ。 「車」というモノを ... すでにあるモノをうまく使って、加工したモノを作れば効率は良くなる。 ... 設計図からオブジェクトを作ることをインスタンス化と呼ぶ。

JavaScriptにおけるクラスとインスタンス | ハックノート
https://hacknote.jp › ハック
2018/09/05 - JavaScriptでは効率よくオブジェクトを作成していくための方法として、最初に「設計図」を用意する必要があります。それがクラスです。 class Data{ }. オブジェクトを生成するための設計図を用意できたので、その設計図から実際にオブジェクトを ...

乃木坂46で、クラス・インスタンス・コンストラクタを理解する - Qiita
https://qiita.com › JavaScript
2019/01/03 - 乃木坂46クラスから、大園桃子オブジェクトを生成するという表現でしょうかね。 ... 効率的にオブジェクトを生成するため ... 先ほど、インスタンスを生成すること(インスタンス化)は「オブジェクトを扱うための自分専用の領域を確保すること」と説明 ...

インスタンス化 効率的にオブジェクトを作成する為 - Google 検索
(検索結果なんてしょっちゅう変わるので、上位3件を引用しておきます。)

なるほど確かにそう言及しているページはあるようです。ただし、検索の1ページ目で一致度が高いと思われるページは、上の3つから最上位を除いた2件だけでした。
(回答投稿時点)

ということで、その2件を見てみましょう。

(こう言い切ってしまうと著者に気の毒なようではありますが)この記事はほとんど内容がありません。何がどう効率がいいのかは、説明されていないようです。強引に書き手の意図を推し量ると「手軽に」「簡単に」などではないかなぁと思いますが、確証は持てません。

この記事はそこそこ分量があり、いいねも77ついているのでそれなりの品質が期待されます。該当部分を抜き出してみます。

1. 効率的にオブジェクトを生成するため
オブジェクトを生成するときに、いちいち「○○プロパティがあって、○○メソッドがあって..」と定義するのは非常に面倒臭い。だから、あらかじめ共通点をクラスに定義しておけば楽なわけです。
乃木坂のメンバー募集するたびに「乃木坂のコンセプトはこうで、こういうグループで..」って定義するのは面倒臭いですよね。
だから、あらかじめメンバーの共通点を定義しておくわけです。そうすると新しいメンバーをオーディションしやすいわけですね。

なるほど、この説明が意図していることは明確です。Python風擬似コードで書くとこういう感じでしょう。

効率的ではないコード

akimoto_manatsu = object()
akimoto_manatsu.name = "秋元真夏"
akimoto_manatsu.name_kana = "あきもと まなつ"
akimoto_manatsu.day_of_birth = date("1993/8/20")

ikuta_erika = object()
ikuta_erika.name = "生田絵梨花"
ikuta_erika.name_kana = "いくたえりか"
ikuta_erika.day_of_birth = date("1997/1/22")

# 人数分続く

# ここで書いた情報は
# https://ja.wikipedia.org/wiki/%E4%B9%83%E6%9C%A8%E5%9D%8246#2011%E5%B9%B4
# による

効率的なコード

class NogizakaMember:
    def __init__(self, name, name_kana, day_of_birth):
        self.name = name
        self.name_kana = name_kana
        self.day_of_birth = day_of_birth

akimoto_manatsu = NogizakaMember("秋元真夏", "あきもと まなつ", date("1993/8/20"))
ikuta_erika = NogizakaMember("生田絵梨花", "いくたえりか", date("1997/1/22"))

確かに「効率的」ですが、空間効率について言及している訳ではありません。
(また、記事の内容についても手放しで賛同できない部分はありますが、本筋から逸れすぎるので言及しません)


結論としては、

「インスタンス化」という手順を取る理由の一つとして「効率的にオブジェクトを作成する為」といわれております。

という質問の前提がそもそも誤っていると言わざるを得ません。一般的にそうは「いわれて」いないのですから。間違った前提で議論をしても意味はありません。

もし「具体的にここでこう書かれている」というものを示していただければ確認はしますが、ググって2件しか引っかかるものがないという状況を踏まえると、いささか飛躍があるのは承知で書くと「インスタンス化という手順を取る一つの理由は効率的にオブジェクトを作成するためである」という前提は一般性が強いとは言えないと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/19 18:32

    たぶん、hayataka2049さんが言及するとは思いますが。

    「スッキリわかるJava入門」
    > という定義を繰り返す必要があるとしたら。それを作るプログラマの作業は

    「Javaのオブジェクト指向がゼッタイにわかる本」
    > コピー&ペーストを繰り返すのもミスを生みかねません

    メモリ効率の話でなく作業効率の話だと思いますが。
    とはいえ、インスタンス化の説明としては微妙。

    キャンセル

  • 2019/12/19 19:24 編集

    > それを作るプログラマの作業は膨人なものになります。

    > その際、各オブジェクトを1つ1つゼロから作成していくのはとても非効率でしょう。コピー&ペーストを繰り返すのもミスを生みかねません。

    といった記述は、コーディングに苦労するという意味で捉えるべきでしょう(つまり私の回答の乃木坂の例と同じようなことを言っている)。

    > 変数領域の複製は実行時に幾つでも作ることができる。(インスタンスを作ることで、必要な数だけ変数領域を作ることができる)

    この説明は確かにメモリ領域に関連しています。しかし、特に効率には言及していないように思います。ついでに言えば、オブジェクト指向プログラミング固有の性質でもありません(Cプログラマなら「それなら構造体でできる」と言うでしょう。ただし、これはあくまでもこの行だけ抜き出した場合のコメントで、元記事の当該部分の説明すべてをCの構造体で満たすことは(少なくとも素朴にやる限りは)できません)。

    キャンセル

  • 2019/12/24 00:21

    遅くなってすいません。回答の方ありがとうこざいました。

    キャンセル

+1

こんにちは。

いまいち余計な回答な気がしますが、せっかくなので書いておきます。

質問では根本的に考えが間違っているところがあって、「オブジェクト指向」というのはプログラム設計の「考え方」であって、メモリがどうこうとは本質的に異なるレイヤ上の話です。
オブジェクト指向の考え方は、「メモリ」なんていうものが存在しない空間上でも議論が成り立つものなのです。

ふわっとオブジェクト指向を語ると、

  • オブジェクトというのは、クラスによって性質を決定付けられた、手で触れる「データ」の単位です。
  • インスタンスというのは、正確には「〇〇 (クラス) のインスタンス」と呼び、〇〇 (クラス) の性質を備えていることが分かっているオブジェクトのことを表します。
  • インスタンス化とは、「〇〇 (クラス) に属するオブジェクトを見つけ出す (転じて、新たに創出する)」ことを指します。
  • オブジェクトの性質 (クラスの定義) とは、オブジェクトが備えている「オペレーション」の集まりとみなします。

さて、どこに「メモリ」という概念が出てきたでしょうか?影も形もありませんね。
この「オブジェクト指向」という概念を「メモリと CPU を用いて駆動するプログラム」という現実に落とし込んだとき、

  • オブジェクトとは、ヒープ領域 (メモリ) に格納された「データ」
  • 〇〇 (クラス) のインスタンスとは、〇〇 (クラス) に定義されたメソッドやプロパティにより操作ができるオブジェクト
  • インスタンス化とは、クラスの定義に沿って、ヒープ領域 (メモリ) に新たな「オブジェクト」を生成すること
  • クラスの定義とは、実際的にはメソッドやプロパティのことで、オブジェクトに持たせるべきオペレーションの定義

となるわけです。

オブジェクト指向だろうと、非オブジェクト指向だろうと、最終的には「メモリと CPU を用いて駆動するプログラム」に落とされるわけで、それ以前の段階において「どのような考え方で設計を行うのか」の違いでしかありません。
ここで非オブジェクト指向と呼んでいるものは、メモリを確保/解放したり、データをメモリ上に配置したり、メソッドでメモリ上のデータを加工するなど、実際のコンピュータ環境を前提にした設計を考えたものとします。
そうすると、このような「コンピュータ環境」を考えずにプログラムを組めるということが、オブジェクト指向プログラミングの最大のメリットであると言えるでしょう。
例えば、「メモリの解放」という (物理的な) 操作も、自動化されているにせよされていないにせよ、「オブジェクトの消去」というオブジェクト指向の文脈上で語ることが可能です。
設計の上では最初から最後まで「オブジェクトの操作」にフォーカスし、メモリなどのローレベルな概念を考えずに済むというわけです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

メモリの確保はしますが、別にそれによって効率がいいとか大量にできるとかは全く関係ないです
そもそも半自動とはどういうことでしょう。意味不明です

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-2

インスタンス化とは(言い換えると)「メモリ領域の確保を効率良く、自動(?)でやってくれるというイメージの解釈」で良いのでしょうか? 

長年C言語プログラマだった私から見ると、メモリ使用効率は悪いけど、開発効率は良くなります。
「なんだ、ただのmallocじゃん。自動的にfreeされて便利じゃん」と思えたとき、クラスが怖くなくなりました。
クラスには処理を書く。クラスで処理するデータがインスタンス。インスタンスはクラスに紐付いたデータ。インスタンス化はデータ領域確保。
そのあと、オブジェクト指向設計で苦労しましたが、「なんだ、普段の生活でやってることじゃん。こんなことしてくれる奴いたら便利じゃん、あとはよろしく」と考えてクラス定義できるようになりました。

Pythonを学ぶと、インスタンスとクラスの関係・役割分担が明確になって面白いですよ。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/17 12:00

    質問の「効率いい」は「メモリ使用効率」という意味ですかね。それならば、目に見えないメモリ使用量が増えますし「効率悪い」ですね。
    私の「効率いい」は「手間がかからない」方の効率いいなので、質問者の意図とは違っているようです。
    大変失礼いたしました。

    キャンセル

  • 2019/12/17 12:03

    いや、どちらの話か知りませんが、少なくとも質問に書いてある記述は色々と不正確なところや本質を誤っているように見えるところや誤解を招くところが多く、そのまま肯定していいような内容ではないと思いました。

    キャンセル

  • 2019/12/17 12:15

    例えばインスタンス化の役割はメモリ確保だけではなく、コンストラクタ引数に基づいて各プロパティを正しく初期化するというのもありますし、手間がかからないというだけなら C++ の自動変数も手間はかかりません。構造体のサイズをプログラマーが指定することなくメモリを確保することができます。また Python のインスタンスが自動的に破棄されるのはオブジェクト指向やインスタンス化とは本質的に無関係です。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る