ユーニックス総合研究所

  • home
  • archives
  • programming-object

プログラミングにおける「オブジェクト(object)」とは?クラスやクラスの実体のこと

オブジェクト(object)っていったいなに?

プログラミングをしているとよく耳にするのが「オブジェクト」というワードです。
あっちでもオブジェクト、こっちでもオブジェクト……。

このオブジェクトですが、1つのワードで複数の意味を持っている場合が多いため、非常に抽象的なワードです。
おそらく厳密に意味を共有してる人は少ないんじゃないでしょうか。

一言で言ってしまうとオブジェクトとは、モノを表す抽象的な表現と言えます。

この記事ではこの「オブジェクト(object)」をひも解いてみたいと思います。

インタプリタにおけるオブジェクト

RubyやPythonなどのインタプリタ言語におけるオブジェクトは、広い意味を持ちます。
それはクラスや関数、あるいはクラスのインスタンスを指します。

  • クラスや関数
  • クラスのインスタンス

インタプリタではクラス名や関数は変数に代入することが出来ます。
これは内部的には1つのオブジェクトとしてメモリ上に領域が確保されています。
このメモリ上に確保されたデータの実体を指してオブジェクトと表現することがあります。
オブジェクトなどの、クラスや関数は変数に入れて持ち運ぶことが可能なわけです。

C/C++やRustなどのコンパイル言語ではクラスの宣言や関数は静的なものであることが多いので、一般的にはオブジェクトとは呼ばれません。
インタプリタではクラスや関数は動的なものであるので、メモリ上にデータが確保されてオブジェクトと表現することが可能になるわけですね。

また、インタプリタ言語でもコンパイル言語でも同じですが、クラスのインスタンスは共通してオブジェクトと呼ばれることが多いです。
クラスのインスタンスとは、クラスにカッコ(())をつけてメモリ上に領域を確保して、変数などに保存することを指します。
たとえばPythonではAnimalというクラスがあるとして、

animal = Animal()  

↑のanimalという変数がインスタンスまたはオブジェクトと呼ばれます。
またそういう意味では、インタプリタ言語では整数や文字列は動的なクラスのインスタンスであることが多いため、これらもオブジェクトと言うことが出来ます。

🦝 < 整数や文字列もオブジェクトなんですって

🐭 < あらまぁ、意外ね

🦊 < インタプリタはオブジェクト地獄やな

その通り! インタプリタはオブジェクトであふれています。
あれもオブジェクト! これもオブジェクト! みんなオブジェクト!
オブジェクトでないものは人にあらず! 非オブジェクトは通報せよ!

🐭 < 暴走してらっしゃる

🦊 < 重症だぁ

オブジェクト指向におけるオブジェクト

オブジェクト指向プログラミングにおけるオブジェクトとは、先ほどのインタプリタのオブジェクトと一部被りますが、クラスをインスタンス化したものがオブジェクトと呼ばれます。
オブジェクトは変数と関数をひとまとめにしたもので、これを使うことがオブジェクト指向の醍醐味と言われます。

コンパイラにおけるオブジェクト

コンパイラはソースコードからバイナリ・ファイルを生成する過程で「オブジェクト・ファイル」という中間表現を出力することがあります。
このオブジェクト・ファイルを指してオブジェクトと言うこともあります。
特にgccclangなどのコンパイラを使う言語、C/C++などでは一般的です。
オブジェクト・ファイルの拡張子は.oobjectoだったりします。

オブジェクト・ファイルはコンパイルを最適化したい時に使われます。
たとえば複数あるソースコードをコンパイルするとき、変更のないソースコードもコンパイルし直すのは非効率的です。
そう言ったときに一度ソースコードをすべてオブジェクト・ファイルにしておいて、変更のあったソースコードだけコンパイルしてオブジェクト・ファイルにして、ほかのオブジェクト・ファイルと繋げて1つのバイナリ・ファイルにするという手法です。

これはMakefileなどのビルドシステムでよく使われる手法です。
こうすることでコンパイル時間を節約し、バイナリ・ファイルのビルドを早くしています。

また、C/C++では構造体を変数などの実体にした場合、その変数がオブジェクトと呼ばれることもあります。
構造体はクラスに近い概念なので、インタプリタと共通する所が多いです。

プログラミング全般におけるオブジェクト

さらにプログラミング全般ではクラスのインスタンスや関数などにかぎらず、全ての対象をオブジェクト言ってしまうことも可能です。
オブジェクトとはそういうふわーっとした抽象的な言葉なんですね。
掴みどころがないためプログラマの人も曖昧に使っていることが多い言葉です。

文脈的には先ほどの解説のようにインタプリタ的な文脈とコンパイラ的な文脈があり、Webではインタプリタ的な文脈で使われることが多いです。
また、IT系の日常的な会話ではオブジェクトは全般的なモノを指す表現であることが多く、非常に抽象的な表現です。

🦝 < 改めて考えると、変な言葉だなぁオブジェクト

🐭 < ほんまやね

おわりに

これで今日からあなたもオブジェクト・マスター。
日常会話にオブジェクトを取り入れて日常会話をオブジェクト指向にしてみましょう。

🦝 < 言葉はオブジェクト?

🐭 < どうだろ?