「デストラクタ」と「ファイナライザ」の違い
予備知識
| 用語 | 意味 |
|---|---|
| オブジェクト指向 | 「モノ(どんなやつで、どう動く)」に注目した考え方 |
| プログラミング言語 | プログラムの元ネタ(ソースコード)を書くときに使う言葉 |
| クラス | オブジェクト指向で使う概念で「それがどんなものか(設計図)」 |
| インスタンス | オブジェクト指向で使う概念で「実体」。クラスをnewしたもの |
| 関数 | 処理のまとまり。何かを入れると何かを計算して何かを返してくれるやつ |
| メソッド | オブジェクト指向における「操作」を定義したもの。動作としては関数と同じ |
| ガベージコレクタ | 定期的にメモリを解放してくれる管理人 |
ガベージコレクタについて、もう少し詳しく見ておきましょう。
ガベージコレクタは、すべてのプログラミング言語にいるわけでは ありません。
ガベージコレクタがいるプログラミング言語もあれば、いないプログラミング言語もあります。
例えば、Javaにはガベージコレクタがいます。
C++にはガベージコレクタがいません。
Javaのようにガベージコレクタがいるプログラミング言語で作ったプログラムの場合、実際にインスタンスが破棄されるタイミングはガベージコレクタ次第です。
例えば、Javaで「Piyota」クラスのインスタンス「p」を作ったとしましょう。
この時点でメモリ上にインスタンス「p」が乗っかります。

インスタンス「p」にあれやこれやの処理をさせました。
その後、インスタンス「p」は用済みになりました。
「もう使わないよ!」状態です。
ところがどっこい、Javaでは、この使わなくなったインスタンス「p」を捨てられません。
使わなくなっても、メモリ上には置きっぱなしにしておくしかないのです。

邪魔ですよね?
もう使わないのにメモリ上にあっても仕方がありません。
ここで登場するのがガベージコレクタです。
ガベージコレクタさんは、ふらふらと巡回しています。

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

つまり、Javaにおいてはガベージコレクタさんが回収していってくれた時点でインスタンスが破棄されます。
本当の意味でインスタンス「p」がメモリ上から消えるのは、ガベージコレクタさんが回収してくれたときなのです。
ガベージコレクタがいるプログラミング言語で作ったプログラムの場合、インスタンスが破棄されるタイミングはガベージコレクタが回収してくれたとき
というのを覚えておいてください。
それぞれの用語の意味
| 用語 | 意味 |
|---|---|
| デストラクタ | (人間様から見て)インスタンスが破棄されたタイミングで実行されるメソッド |
| ファイナライザ | (ガベージコレクタから見て)インスタンスが破棄されたタイミングで実行されるメソッド |
似ているところ
どちらもクラス内に定義するメソッドです。
また、どちらもインスタンスが破棄されたときに実行されます。
違うところ
実行されるタイミングが違います。
それぞれ
デストラクタ:インスタンスが人間様から見て破棄されたときに実行
ファイナライザ:インスタンスがガベージコレクタから見て破棄されたときに実行
されるメソッドです。







