デストラクタ
メソッド(関数)だよ
インスタンスが破棄されたときに実行されるよ
「ファイナライザ」と似て非なるやつだよ
簡単に書くよ
デストラクタ(英:destructor)とは
オブジェクト指向
(「モノ」に注目した考え方)なプログラミング言語で出てくる用語のひとつ
であり
(人間様から見て)インスタンス
(オブジェクト指向の話で出てくる概念のひとつでクラスを具現化した実体)が破棄されたタイミングで実行されるメソッド
(「オブジェクトの操作を定義したもの」だけど、動きとしては関数と同じ)のこと
です。
詳しく書くよ
順番に見ていきましょう。
まずは予備知識として
・関数
・オブジェクト指向
・クラス
・インスタンス
・メソッド
について説明します。
「そんなの説明されなくても知ってるよ!」な人は適当に読み飛ばしてください。
関数は「何かを入れると何かをやって何かを返してくれる、処理のまとまり」です。
一般的には、入力を受けて処理をやり、その結果として出力があります。
ついでなので書いておくと、関数に入れる値は「引数(ヒキスウ)」と言います。
関数から出てくる値は「戻り値」です。
ちょっと汚い話で恐縮ですが、人間は、ご飯を食べて、ウンチを出します。
人間が関数だと考えてください。
ご飯に相当するものが引数です。
ウンチに相当するものが戻り値になります。
オブジェクト指向は「『モノ』に注目した考え方」です。
「どんなやつで、どう動く」に注目した考え方です。
詳細は、用語「オブジェクト指向」の説明を ご覧ください。
オブジェクト指向の理念に沿って作られたプログラミング言語を「オブジェクト指向プログラミング言語」と言います。
有名どころでは、Javaなんかがオブジェクト指向プログラミング言語です。
オブジェクト指向プログラミング言語では
・クラス
・インスタンス
・オブジェクト
の3つの用語が よく出てきます。
この3つは とても大事です。
ざっくりとで良いので関係性を覚えておいてください。
専門家の人からは怒られそうですが、ものすごい大雑把に説明すると
クラス:設計図
インスタンス:実際に作った物
オブジェクト:モノ(クラスとかインスタンスとかを、ふんわりと表現したもの)
です。
クラスは「設計図」です。
「それって、どんなもの?」を示しています。
ピヨ太君の頭の中にある「ピヨピヨ時計は こんな感じだな」がクラスです。
インスタンスは「実際に作ったもの」です。
クラス(設計図)に書かれた「それって、どんなもの?」を形にしたものを指します。
実際に作ったピヨピヨ時計がインスタンスです。
オブジェクトは……モノですよ、モノ。
結構ざっくりとした使われ方をする用語です。
「クラスとかインスタンスを ふんわりと表現したもの」くらいに解釈してください。
よく分からない人は忘れてしまって かまいません。
メソッドは、教科書的な説明をすれば「オブジェクトの『操作』を定義したもの」です。
ただし、今回は
クラス内に定義した関数のこと
と解釈してください。
その方がイメージしやすいと思います。
以上を踏まえて
(人間様から見て)インスタンスを破棄したときに実行されるメソッド
が「デストラクタ」です。
クラスは設計図です。
そのままでは使えません。
使いたいときは実際のもの(インスタンス)にして使います。
設計図(クラス)をもとにして作った実際のもの(インスタンス)を使い終わりました。
使い終わったら邪魔です。
捨てちゃいます。
この「設計図(クラス)をもとにして作った実際のもの(インスタンス)を捨てるタイミング」で実行される関数(メソッド)がデストラクタです。
以上でデストラクタの基本的な説明は終わりです。
ここからは少しばかりややこしい補足説明が始まります。
余裕がある方は頑張って読んであげてください。
脳みそから煙が出そうな人は無理する必要ありません。
ゆっくり休んでください。
あっ、読んでくださるのですね。
ありがとうございます。
それでは、いってみましょう。
実は、デストラクタと似て非なるものに「ファイナライザ」があります。
ファイナライザは「インスタンスが破棄されたタイミングで実行されるメソッド」です。
おっと、デストラクタも「インスタンスが破棄されたタイミングで実行されるメソッド」でした。
何が違うのでしょうね?
デストラクタとファイナライザの違いを理解するには「ガベージコレクタ」と呼ばれるやつを理解しておく必要があります。
まずはガベージコレクタについて、お勉強しましょう。
ガベージコレクタは「メモリの掃除屋さん」です。
プログラムで使わなくなったメモリを解放するお仕事をしています。
ガベージコレクタは、すべてのプログラミング言語にいるわけでは ありません。
ガベージコレクタがいるプログラミング言語もあれば、いないプログラミング言語もあります。
例えば、Javaにはガベージコレクタがいます。
C++にはガベージコレクタがいません。
Javaのようにガベージコレクタがいるプログラミング言語で作ったプログラムの場合、実際にインスタンスが破棄されるタイミングはガベージコレクタ次第です。
例えば、Javaで「Piyota」クラスのインスタンス「p」を作ったとしましょう。
この時点でメモリ上にインスタンス「p」が乗っかります。
インスタンス「p」にあれやこれやの処理をさせました。
その後、インスタンス「p」は用済みになりました。
「もう使わないよ!」状態です。
ところがどっこい、Javaでは、この使わなくなったインスタンス「p」を捨てられません。
使わなくなっても、メモリ上には置きっぱなしにしておくしかないのです。
邪魔ですよね?
もう使わないのにメモリ上にあっても仕方がありません。
ここで登場するのがガベージコレクタです。
ガベージコレクタさんは、ふらふらと巡回しています。
そして、メモリ上に「あれ?これって、もう誰も使っていないじゃん」なものを見つけたら回収していってくれるのです。
つまり、Javaにおいてはガベージコレクタさんが回収していってくれた時点でインスタンスが破棄されます。
本当の意味でインスタンス「p」がメモリ上から消えるのは、ガベージコレクタさんが回収してくれたときなのです。
この「ガベージコレクタさんが回収してくれたタイミング」で実行される関数がファイナライザです。
注意点として、ガベージコレクタさんがいつ回収してくれるかはガベージコレクタさん次第です。
つまり、ファイナライザがいつ実行されるかもガベージコレクタさん次第です。
人間様は関知できません。
一般的に、デストラクタは「人間様から見て破棄された瞬間」に実行されます。
例えば「これは、もう使わないから捨てるね!」な指示を書いたとしましょう。
C++を例にすれば
delete p;
のような内容です。
この内容が実行されたタイミングでデストラクタは動きます。
あるいは「これは、もう使えないからね」な状態になったら実行されます。
いわゆる「スコープの範囲外になったら」な状態です。
それに対して、ファイナライザは「ガベージコレクタから見て破棄された瞬間」に実行されます。
ガベージコレクタさんが回収したタイミングで実行されるのです。
人間様は、いつ実行されるか分かりません。
これがデストラクタとファイナライザの違いです。
デストラクタ:人間様から見て、インスタンスが破棄されたタイミングで実行されるメソッド
ファイナライザ:ガベージコレクタから見て、インスタンスが破棄されたタイミングで実行されるメソッド
です。
もしかしたら、プログラミング言語によっては、デストラクタっぽいやつをファイナライザと呼んだり、ファイナライザっぽいやつをデストラクタと呼ぶ場合もあるかもしれませんけどね。
少なくともJavaやC++などの有名どころで登場する「デストラクタ」「ファイナライザ」は、ここまでに長々と書いた通りです。
一言でまとめるよ
まぁ「デストラクタ」って単語が出てきたら「(人間様から見て)インスタンス
(オブジェクト指向の話で出てくる概念のひとつでクラスを具現化した実体)が破棄された瞬間に実行される関数
(処理のまとまり)なんだな~」と お考えください。






