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

ファイナライザ

pointこの用語のポイント

pointメソッド(関数)だよ

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

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

スポンサーリンク

簡単に書くよ

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

オブジェクト指向(「モノ」に注目した考え方)なプログラミング言語で出てくる用語のひとつ
であり

(ガベージコレクタ(定期的にメモリを解放してくれる管理人さん)から見て)インスタンス(オブジェクト指向の話で出てくる概念のひとつでクラスを具現化した実体)が破棄されたタイミングで実行されるメソッド(「オブジェクトの操作を定義したもの」だけど、動きとしては関数と同じ)のこと
です。


image piyo

詳しく書くよ

順番に見ていきましょう。
まずは予備知識として

関数
オブジェクト指向
クラス
インスタンス
メソッド
ガベージコレクタ


について説明します。
「そんなの説明されなくても知ってるよ!」な人は適当に読み飛ばしてください。

関数は「何かを入れると何かをやって何かを返してくれる、処理のまとまり」です。
一般的には、入力を受けて処理をやり、その結果として出力があります。

ファイナライザ

ついでなので書いておくと、関数に入れる値は「引数(ヒキスウ)」と言います。

ファイナライザ2

関数から出てくる値は「戻り値」です。

ファイナライザ3

ちょっと汚い話で恐縮ですが、人間は、ご飯を食べて、ウンチを出します。

ファイナライザ4

人間が関数だと考えてください。
ご飯に相当するものが引数です。
ウンチに相当するものが戻り値になります。

ファイナライザ5

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

ファイナライザ6

詳細は、用語「オブジェクト指向」の説明を ご覧ください。

ファイナライザ7

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

オブジェクト指向プログラミング言語では

クラス
インスタンス
オブジェクト


の3つの用語が よく出てきます。
この3つは とても大事です。
ざっくりとで良いので関係性を覚えておいてください。

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

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


です。

クラスは「設計図」です。
「それって、どんなもの?」を示しています。
ピヨ太君の頭の中にある「ピヨピヨ時計は こんな感じだな」がクラスです。

ファイナライザ8

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

ファイナライザ9

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

ファイナライザ10

メソッドは、教科書的な説明をすれば「オブジェクトの『操作』を定義したもの」です。
ただし、今回は

クラス内に定義した関数のこと

と解釈してください。
その方がイメージしやすいと思います。

ガベージコレクタは「定期的にメモリを解放してくれる管理人さん」です。

ファイナライザ11

人間様の場合、お仕事をするときは、机の上に書類や筆記用具を広げます。

ファイナライザ12

お仕事が終わったら、机の上を片付けます。

ファイナライザ13

プログラムも同じです。

プログラムが動くときはメモリを使います。
メモリの上に、お仕事道具を広げるのです。

ファイナライザ14

お仕事が終わったら、メモリの上を片付けます。

ファイナライザ15

これが本来の形ですが、実はお片付けが苦手なプログラムがいます。
やったらやりっぱなし、散らかしたら散らかしっぱなしの残念なやつです。

ファイナライザ16

散らかしっぱなしでは他のプログラムに迷惑がかかります。
仕事をすればするほど、メモリの上がどんどん汚くなりますからね。
いずれ新しいお仕事道具を広げられなくなるでしょう。

ファイナライザ17

それを避けるために、お片付けが苦手なプログラムは自分のポケットマネーで管理人さんを雇っている場合があります。
管理人さんは、プログラムが散らかしっぱなしにしたお仕事道具を片付けるのが仕事です。

ファイナライザ18

これで安心ですね。
いくらプログラムがメモリの上を散らかしても管理人さんが片付けてくれます。
お仕事の後でもメモリは綺麗になっているでしょう。

この

メモリの上を綺麗にしてくれる管理人さん

がガベージコレクタです。

ファイナライザ19

以上を踏まえて

(ガベージコレクタから見て)インスタンスを破棄したときに実行されるメソッド

が「ファイナライザ」です。

ファイナライザ20

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

ファイナライザ21

設計図(クラス)をもとにして作った実際のもの(インスタンス)を使い終わりました。
使い終わったら邪魔です。
捨てちゃいます。

ファイナライザ22

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

自分で捨てられるプログラミング言語は、例えばC++です。

delete p;

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

自分で捨てられないプログラミング言語は、例えばJavaです。
Javaではガベージコレクタが捨ててくれます。

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

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

ファイナライザ23

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

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

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

ファイナライザ24

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

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

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

ファイナライザ25

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

ファイナライザ26

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

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

ファイナライザ27

注意点として、ガベージコレクタさんがいつ回収してくれるかはガベージコレクタさん次第です。
つまり

ファイナライザがいつ実行されるかもガベージコレクタさん次第

です。
人間様は関知できません。

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

ここから先は余談です。
余裕がある方は頑張って読んであげてください。
脳みそから煙が出そうな人は無理する必要ありません。
ゆっくり休んでください。

休め

あっ、読んでくださるのですね。
ありがとうございます。

それでは、いってみましょう。

ファイナライザと紛らわしいやつに「デストラクタ」がいます。
デストラクタは「インスタンスが破棄されたタイミングで実行されるメソッド」です。
ファイナライザと同じような説明ですね。

ただし、中身は大きく違います。

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

delete p;

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

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

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

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

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

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


です。

ファイナライザ28

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


image piyo2

一言でまとめるよ

まぁ「ファイナライザ」って単語が出てきたら「(ガベージコレクタ(定期的にメモリを解放してくれる管理人さん)から見て)インスタンス(オブジェクト指向の話で出てくる概念のひとつでクラスを具現化した実体)が破棄された瞬間に実行される関数(処理のまとまり)なんだな~」と お考えください。

一番上に戻るよ
スポンサーリンク
書籍画像057
書籍画像008

おまけ

■訳してみるよ

「finalizer(ファイナライザ)」は「finalize(ファイナライズ)」+「er」です。
「finalize(ファイナライズ)」の意味は「完成させる」とか「終了させる」とかです。
接尾辞「er」を付けると「~する人」とか「~するもの」的な意味になります。
何となく くっつけると

完成させるやつ

となります。




書籍画像
わわわ説明術コラム
宣伝だよ
「分かった!」と思わせる説明の技術 知識ゼロの相手にも伝わるようになる本【Audible】
わかばちゃんとつくって、壊して、直して学ぶ NewSQL入門
「定年力」の鍛え方 老後の毎日を最高にする方法