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

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

ファイナライザ (finalizer)

pointこの用語のポイント

pointメソッド(関数)だよ

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

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

point「デストラクタ」と似て非なるやつだよ

スポンサーリンク

簡単に書くよ

ファイナライザ (finalizer)とは

「デストラクタ」と少し似ているけど実際には全然違うやつ。
もう少し具体的に書くと

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

image piyo

詳しく書くよ

順番に見ていきましょう。

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

ファイナライザ

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

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

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

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


です。

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

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

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

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

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

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

ファイナライザ2

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

ファイナライザ3

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

使い終わりました。

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

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

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

この捨て方ですが、プログラミング言語によってやり方が違います。
自分で捨てることができるプログラミング言語と、捨てられないプログラミング言語があるのです。

自分で捨てることができるプログラミング言語は、例えばC++です。

delete p;

とか書くと、指定したもの(例では「p」)が破棄されます。

自分で捨てることができないプログラミング言語は、例えばJavaです。
Javaでは「ガベージコレクタ」と呼ばれるやつが捨ててくれます。

このガベージコレクタが今回の説明の肝です。
ガベージコレクタについて、もう少し深くお勉強しておきましょう。

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

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

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

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

ファイナライザ4

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

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

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

ファイナライザ5

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

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

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

ファイナライザ6

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

ファイナライザ7

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

さぁ、いよいよ本題です。

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

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

これがファイナライザの基本的な説明です。
ガベージコレクタがインスタンスを破棄したときに実行される関数を指します。

以下は余談です。
脳みその容量に余裕がない人は、適当に読み飛ばしてください。

ファイナライザと紛らわしいやつに「デストラクタ」がいます。
デストラクタも、ファイナライザと同じように「インスタンスが破棄されたときに実行される関数」を指す用語です。

ただし、中身は大きく異なります。

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

delete p;

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

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

人間様は、デストラクタが実行されるタイミングを把握することができます。

それに対して、ファイナライザは「ガベージコレクタの目から見て」破棄された瞬間に実行されます。
ガベージコレクタさんが回収したタイミングで実行されるのです。
人間様は、ファイナライザが実行されるタイミングを把握することはできません。

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

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


と理解してください。

ガベージコレクタさんが「使ってないみたいだから回収していくね!」としたときに実行されるのが「ファイナライザ」です。
人間様が「これはもう使わないから捨てるね!」としたときに実行されるのが「デストラクタ」です。

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

image piyo2

一言でまとめるよ

まぁ「ファイナライザ」って単語が出てきたら「(ガベージコレクタから見て)インスタンスが破棄された瞬間に実行される関数なんだな~」と、お考えください。

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