[ 通常表示 ]  [ 簡易表示 ]  [ シンプル表示 ]

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典イメージぴよ画像「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

デストラクタ (destructor)

pointこの用語のポイント

pointメソッド(関数)だよ

pointインスタンスが破棄されたときに実行されるよ

pointオブジェクト指向なプログラミング言語で出てくるよ

point「ファイナライザ」と似て非なるやつだよ

スポンサーリンク

簡単に書くよ

デストラクタ (destructor)とは

「コンストラクタ」の逆。
もう少し具体的に書くと

オブジェクト指向のプログラミング言語で登場する用語で、(人間様の目から見て)インスタンスが破棄されたタイミングで実行されるメソッドのこと
です。

image piyo

詳しく書くよ

一言で言ってしまえば「コンストラクタの逆」が「デストラクタ」です。

コンストラクタは「インスタンスを作成したタイミングで実行されるメソッド」ね。
クラスをnewした瞬間に実行される関数です。

「コントラクタ」とか「インスタンス」とか「メソッド」とか「クラス」とか、カタカナ用語が多くて分かりにくいですね。

このページを読まれる方は、できれば先に「コンストラクタ」の説明をご覧ください。
それぞれの用語の説明も書いてありますので、その方が理解しやすいと思います。

……と書いても面倒くさがって読まない方がいらっしゃると思うので、ここでも簡単に説明しておきましょう。

まず、オブジェクト指向は「『モノ』に注目した考え方」です。
「どんな奴で、どう動く」に注目した考え方です。

デストラクタ

オブジェクト指向の理念に沿って作られたプログラミング言語を「オブジェクト指向プログラミング言語」と言います。
有名どころでは、Javaなんかがオブジェクト指向プログラミング言語です。

オブジェクト指向プログラミング言語では「クラス」「インスタンス」「オブジェクト」という用語が頻繁に登場します。
この3つは、とても大事です。
ざっくりとで構わないので、関係性を覚えておいてください。

専門家の人からは怒られそうですが、ものすごい大雑把に説明すると

・クラス:設計図
・インスタンス:実際に作った物
・オブジェクト:モノ(クラストとかインスタンスとかをふんわりと表現したもの)


です。

クラスは「設計図」です。
「それってどんなもの?」を示しています。

インスタンスは「実際に作ったもの」です。
クラス(設計図)に書かれた「それってどんなもの?」を形にしたものです。

オブジェクトは……モノですよ、モノ。
結構ざっくりとした使われ方をする用語です。
「クラスとかインスタンスをふんわりと表現したもの」くらいに解釈してください。

オブジェクトについては、よく分からない人は忘れてしまって構いません。
デストラクタを理解する上では、覚えていなくても支障はない用語です。

ざっくりと「クラス」「インスタンス」「オブジェクト」を理解できたでしょうか。

クラスは設計図です。
インスタンスはクラス(設計図)を実際に形にしたものです。
オブジェクトはクラスとかインスタンスをふんわりと表現したものですが、気にしなくて良いです。

デストラクタ2

クラスは設計図なので、そのままでは使えません。
使いたいときは実際のもの(インスタンス)にして使います。

デストラクタ3

この、設計図(クラス)から実際のもの(インスタンス)を作るタイミングで実行される関数(メソッド)がコンストラクタです。
メソッドと関数は同じようなものと考えて構いません。用語の意味としては別のものですが、やってることは同じです。

設計図は実際のものになって使われます。
クラスはインスタンスになって使われます。

使い終わりました。

使い終わったら、邪魔です。
そこに置いておいても仕方がありません。

邪魔ならば、捨てましょう。

ということで、使い終わったら、実際のもの(インスタンス)を捨てます。

この、設計図(クラス)を元にして作った実際のもの(インスタンス)を捨てるタイミングで実行される関数(メソッド)がデストラクタです。

余裕があれば、コンストラクタとデストラクタはセットで覚えてあげてください。

コンストラクタ:インスタンスを作るときに動く関数
デストラクタ:インスタンスを捨てるときに動く関数


です。

これで、デストラクタの基本的な説明は終わりです。

ここからは、少しばかりややこしい補足説明が始まります。
脳みその容量に余裕がない方は、読み飛ばしてください。

実は、デストラクタと似たようなものに「ファイナライザ」があります。

デストラクタは「インスタンスが破棄されたタイミングで実行されるメソッド」です。
ファイナライザは「インスタンスが破棄されたタイミングで実行されるメソッド」です。

何が違うのでしょうね?

デストラクタとファイナライザの違いを理解するためには「ガベージコレクタ」と呼ばれるやつを理解しておく必要があります。
まずはガベージコレクタについて、お勉強しましょう。

ガベージコレクタは、一言で言ってしまえば「メモリの掃除屋さん」です。
プログラムで使わなくなったメモリを解放するお仕事をしています。

ガベージコレクタは、すべてのプログラミング言語にいるわけではありません。
ガベージコレクタがいるプログラミング言語もあれば、いないプログラミング言語もあります。
例えば、Javaにはガベージコレクタがいます。
C++にはガベージコレクタがいません。

Javaのようにガベージコレクタがいるプログラミング言語で作ったプログラムの場合、実際にインスタンスが破棄されるタイミングはガベージコレクタ次第です。

例えば、Javaでクラス「Piyota」のインスタンス「p」を作ったとしましょう。
この時点でメモリ上にインスタンス「p」が乗っかります。

デストラクタ4

インスタンス「p」にあれやこれやの処理をさせました。

そしてインスタンス「p」は用済みになりました。
「もう使わないよ!」状態です。

ところがどっこい、Javaにおいては、この使わなくなったインスタンス「p」を捨てることができません。
使わなくなっても、メモリ上には置きっぱなしにしておくしかないのです。

デストラクタ5

邪魔ですよね?
もう使わないのにメモリ上にあっても仕方がありません。

ここで登場するのが、ガベージコレクタです。

ガベージコレクタさんは、ふらふらと巡回しています。

デストラクタ6

そして、メモリ上に「あれ?これって、もう誰も使っていないじゃん」なものを見つけたら回収していってくれるのです。

デストラクタ7

つまり、Javaにおいては、ガベージコレクタさんが回収していってくれた時点で、インスタンスが破棄されます。
インスタンス「p」がメモリ上から消えるのは、ガベージコレクタさんが回収してくれたときなのです。

この、ガベージコレクタさんが回収してくれたタイミングで実行される関数がファイナライザです。

注意点として、ガベージコレクタさんがいつ回収してくれるかはガベージコレクタさん次第です。
つまり、ファイナライザがいつ実行されるかもガベージコレクタさん次第です。
人間様が関知できるところではありません。

この点が、デストラクタと大きく異なります。

一般的に、デストラクタは「(人間様の目から見て)破棄された瞬間」に実行される関数です。
例えば「これはもう使わないから捨てるね!」な指示を書いたとしましょう。
C++を例にすれば

delete p;

のような内容です。
この内容が実行されたタイミングで、デストラクタは動きます。

あるいは「これはもう使えないからね」な状態になったら実行されます。
いわゆる「スコープの範囲外になったら」な状態です。

それに対して、ファイナライザは「(ガベージコレクタの目から見て)破棄された瞬間」に実行される関数です。
ガベージコレクタさんが回収したタイミングで実行されるのです。
人間様は、いつ実行されるか分かりません。

これがデストラクタとファイナライザの違いです。

デストラクタ:人間様から見て、インスタンスが破棄されたタイミングで実行されるメソッド
ファイナライザ:ガベージコレクタから見て、インスタンスが破棄されたタイミングで実行されるメソッド


の違いです。

もしかしたら、プログラミング言語によっては、デストラクタっぽいやつをファイナライザと呼んだり、ファイナライザっぽいやつをデストラクタと呼ぶ場合もあるかもしれませんけどね。
少なくとも、JavaやC++などの有名どころで登場する「デストラクタ」「ファイナライザ」は、ここまでに長々と書いた通りです。

image piyo2

一言でまとめるよ

まぁ「デストラクタ」って単語が出てきたら「(人間から見て)インスタンスが破棄された瞬間に実行される関数なんだな~」と、お考えください。

一番上に戻るよ
スポンサーリンク