2023. 1. 22. 21:16ใJAVA/Effective JAVA
item08. finalizer์ cleaner ์ฌ์ฉ์ ํผํ๋ผ.
์ดํํฐ๋ธ ์๋ฐ part 1์์๋ ๊ฐ์ฒด์ ์์ฑ๊ณผ ์๋ฉธ์ ๋ํด์ ์๊ธฐํ๊ณ ์๋๋ฐ ์ง๊ธ์ ์ ๋ฒ item ๋ถํฐ๋ ๊ฐ์ฒด ์๋ฉธ์ ๋ํด์ ์ด์ผ๊ธฐ ํ๊ณ ์๋ค.
์ฐ์ ์๋ฐ์์๋ ๋ ๊ฐ์ง ๊ฐ์ฒด ์๋ฉธ์๋ฅผ ์ ๊ณตํ๋ค.
finalizer์ cleaner์ธ๋ฐ ๊ฒฐ๋ก ์ ์๊ธฐํ์๋ฉด ๋๋ค ์ฌ์ฉ์ ๊ถ์ฅํ์ง ์๋๋ค. ์๋ ๊ถ์ฅ์ด ์๋๋ผ ์ฑ ์์๋ ์ฌ์ฉํ๋ ๊ฒ์ ํผํ๋ผ๊ณ ํ๋ค. (ํนํ finalizer)
ํนํ finalizer๋ ์์ธกํ ์ ์๊ณ , ์ํฉ์ ๋ฐ๋ผ ์ํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ๋ถํ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ค๋์, ๋ฎ์ ์ฑ๋ฅ, ์ด์์ฑ ๋ฌธ์ ์ ์์ธ์ด ๋๊ธฐ๋ ํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฐ์ง ๋ง๋ผ๊ณ ํ๋ค.
ํนํ java 9๋ถํฐ๋ deprecated ๋์ด์ ๋์์ผ๋ก cleaner๋ฅผ ์๊ฐํ๊ณ ์๋๋ฐ cleaner๋ ๊ทธ๋๋ง finalizer๋ณด๋ค๋ ๋ ์ํํ์ง๋ง, cleaner ์ญ์ ์์ธกํ ์ ์๊ณ , ๋๋ฆฌ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ๋ถํ์ํ๋ค.
1๏ธโฃ finalizer์ cleaner๋ ์ฆ์ ์ํ๋๋ค๋ ๋ณด์ฅ์ด ์๋ค.
finalizer์ cleaner๊ฐ ์คํ๋๊ธฐ๊น์ง ์ผ๋ง๋ ๊ฑธ๋ฆฌ๋์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ ๋ ์คํ๋์ด์ผ ํ๋ ์์ ์ ์ ๋ ์ฌ์ฉํ๋ฉด ์๋๋ค.
ex) ํ์ผ ๋ซ๊ธฐ๋ฅผ finalizer ํน์ cleaner์ ๋งก๊ธฐ๋ฉด ์ค๋ํ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค.
-> ์์คํ ์ด ๋์์ ์ด ์ ์๋ ํ์ผ ๊ฐ์์๋ ํ๊ณ๊ฐ ์๋๋ฐ finalizer๋ cleaner๊ฐ ํ์ผ ๋ซ๊ธฐ๋ฅผ ์ฆ์ ์ํํ์ง ์์์ ํ์ผ์ ๊ณ์ ์ด์ด ๋๋ค๋ฉด ์๋ก์ด ํ์ผ์ผ ์ด์ง ๋ชปํด์ ํ๋ก๊ทธ๋จ์ด ์คํจํ๋ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค.
2๏ธโฃ finalizer๋ cleaner ์ํ ์์ ๋ฟ ์๋๋ผ ์ํ ์ฌ๋ถ์กฐ์ฐจ ๋ณด์ฅํ์ง ์๋๋ค.
์ด ๋ง์ ์ฆ ์ ๊ทผํ ์ ์๋ ์ผ๋ถ ๊ฐ์ฒด์ ๋ธ๋ฆฐ ์ข ๋ฃ ์์ ์ ์ ํ ์ํํ์ง ๋ชปํ ์ฑ ํ๋ก๊ทธ๋จ์ด ์ค๋จ๋ ์๋ ์๋ค๋ ์ด์ผ๊ธฐ์ด๋ค.
๋ฐ๋ผ์ ํ๋ก๊ทธ๋จ ์์ ์ฃผ๊ธฐ์ ์๊ด์๋, ์ํ๋ฅผ ์๊ตฌ์ ์ผ๋ก ์์ ํ๋ ์์ ์์๋ ์ ๋ finalizer, cleaner ์ ์์กดํด์๋ ์๋๋ค.
ex) ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ๊ณต์ ์์์ ์๊ตฌ ๋ฝ(lock) ํด์ ๋ฅผ finalizer ๋๋ cleaner์ ๋งก๊ธฐ๋ฉด ๋ถ์ฐ ์์คํ ์ ์ฒด๊ฐ ์์ํ ๋ฉ์ถ๊ฒ ๋ ๊ฒ์ด๋ค..
3๏ธโฃ finalizer ๋์ ์ค ๋ฐ์ํ ์์ธ๋ ๋ฌด์๋๋ฉฐ, ์ฒ๋ฆฌํ ์์ ์ด ๋จ์๋๋ผ๋ ๊ทธ ์๊ฐ ์ข ๋ฃ๋๋ค.
์ก์ง ๋ชปํ ์์ธ ๋๋ฌธ์ ํด๋น ๊ฐ์ฒด๋ ๋ง๋ฌด๋ฆฌ๊ฐ ๋ ๋ ์ํ๋ก ๋จ์ ์๋ ์๋ค.
4๏ธโฃ finalizer์ cleaner๋ ์ฌ๊ฐํ ์ฑ๋ฅ ๋ฌธ์ ๋ ๋๋ฐํ๋ค.
5๏ธโฃ finalizer๋ฅผ ์ฌ์ฉํ ํด๋์ค๋ finalizer ๊ณต๊ฒฉ์ ๋ ธ์ถ๋์ด ์ฌ๊ฐํ ๋ณด์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์๋ ์๋ค.
๐ก ๋์
๋ฐ๋ฉํ ์์์ด ์๋ ํด๋์ค๋ AutoCloseable ์ ๊ตฌํํ๊ณ ํด๋ผ์ด์ธํธ์์ close()๋ฅผ ํธ์ถํ๊ฑฐ๋
try-with-resource๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
AutoCloseable์ ๊ตฌํํด์ฃผ๊ณ , ํด๋ผ์ด์ธํธ์์ ์ธ์คํด์ค๋ฅผ ๋ค ์ฐ๊ณ ๋๋ฉด close ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๋๋ค.
(์ผ๋ฐ์ ์ผ๋ก๋ ์์ธ๊ฐ ๋ฐ์ํด๋ ์ ๋๋ก ์ข ๋ฃ๋๋๋ก try-with-resource๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.)
๊ทธ๋ฆฌ๊ณ cleaner๋ ์์ ๋ง์ผ๋ก ์ฌ์ฉํด ํ๋์ ์์์ ์์ ์๊ฐ close๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์๋ ๊ฒ์ ๋๋นํ ์์ ๋ง ์ญํ ์ ํ๊ฒ ํ๋ฉด ๋๋ค.
package chapter01.item08.cleaner_as_a_safetynet;
import java.lang.ref.Cleaner;
// cleaner๋ฅผ ์์ ๋ง์ผ๋ก ํ์ฉํ๋ AutoClosable ํด๋์ค
public class Room implements AutoCloseable {
private static final Cleaner cleaner = Cleaner.create();
// ์ฒญ์๊ฐ ํ์ํ ์์, ์ ๋ Room์ ์ฐธ์กฐํด์๋ ์๋๋ค!!
private static class State implements Runnable {
int numJunkPiles;
State(int numJunkPiles) {
this.numJunkPiles = numJunkPiles;
}
@Override
public void run() {
System.out.println("Cleaning room");
numJunkPiles = 0;
}
}
private final State state;
private final Cleaner.Cleanable cleanable;
public Room(int numJunkPiles) {
state = new State(numJunkPiles);
cleanable = cleaner.register(this, state);
}
@Override
public void close() {
cleanable.clean();
}
}
Room ํด๋์ค๋ AutoCloseable์ ๊ตฌํํ๊ณ , static์ผ๋ก ์ ์ธ๋ ์ค์ฒฉ ํด๋์ค์ธ State๋ cleaner๊ฐ ๋ฐฉ์ ์ฒญ์ํ ๋ ์๊ฑฐํ ์์๋ค์ ๋ด๊ณ ์๋ค.
State ํด๋์ค๋ Runnable์ ๊ตฌํํ๊ณ ๊ทธ ์์ run ๋ฉ์๋๋ cleanable์ ์ํด์ ๋ฑ ํ๋ฒ๋ง ํธ์ถ๋ ๊ฒ์ด๋ค.
์ด๋ State ํด๋์ค๋ ์ ๋ Room ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํด์๋ ์๋๋ค!! ์๋ํ๋ฉด Room ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ๊ฒฝ์ฐ ์ํ์ฐธ์กฐ๊ฐ ์๊ธฐ๊ธฐ ๋๋ฌธ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ Room ์ธ์คํด์ค๋ฅผ ํ์ํด ๊ฐ ๊ธฐํ๊ฐ ์ค์ง ์๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐํ๋ฉด ์๋๋ค.
cleanable ๊ฐ์ฒด๋ Room ์์ฑ์์์ cleaner์ Room๊ณผ State๋ฅผ ๋ฑ๋กํ ๋ ์ป๋๋ค.
๊ทธ๋ฆฌ๊ณ run ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ์ํฉ์ ๋ ์ค ํ๋๋ก ์ฒซ๋ฒ์งธ๋ Room์ด close ๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ก close ๋ฉ์๋์์ cleanable ์ clean ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ด ๋ฉ์๋ ์์์ run ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
๋๋ฒ์งธ๋ก๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ Room์ ํ์ํ ๋๊น์ง ํด๋ผ์ด์ธํธ๊ฐ clean์ ํธ์ถํ์ง ์๋๋ค๋ฉด cleaner๊ฐ State์ run ๋ฉ์๋๋ฅผ ํธ์ถํด์ค ๊ฒ์ด๋ค.
// cleaner ์์ ๋ง์ ๊ฐ์ถ ์์์ ์ ๋๋ก ํ์ฉํ์ง ๋ชปํ๋ ํด๋ผ์ด์ธํธ
public class Teenager {
public static void main(String[] args) {
new Room(99);
System.out.println("Peace out");
System.gc();
}
}
์ฒซ๋ฒ์งธ Teenager ํด๋์ค๋ Cleaner ์์ ๋ง์ ๊ฐ์ถ ์์์ ์ ๋๋ก ํ์ฉํ์ง ๋ชปํ ํด๋ผ์ด์ธํธ๋ก clean์ ํธ์ถํ์ง ์์๋ค๊ฐ System.gc() ์ถ๊ฐ๋ก ์ธํด clenaer๊ฐ State์ run ๋ฉ์๋๋ฅผ ํธ์ถํด์ "Cleaning room"์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์๋ ์์ ๊ฒ์ด๋ค.
// cleaner ์์ ๋ง์ ๊ฐ์ถ ์์์ ์ ๋๋ก ํ์ฉํ๋ ํด๋ผ์ด์ธํธ
public class Adult {
public static void main(String[] args) {
try(Room myRoom = new Room(7)) {
System.out.println("hi");
}
}
}
Audult ํด๋์ค๋ cleaner ์์ ๋ง์ ๊ฐ์ถ ์์์ ์ ๋๋ก ํ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ก ๊ธฐ๋ํ ๋๋ก "hi"์ "Cleaning room"์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
โ๏ธ Room์ cleaner๋ ๋จ์ง ์์ ๋ง์ผ๋ก ํด๋ผ์ด์ธํธ๊ฐ clean์ ํธ์ถํ์ง ์์์ ๋๋ฅผ ๋๋นํด์ ๋ง๋ ๊ฒ์ผ๋ก ํด๋ผ์ด์ธํธ๊ฐ ๋ชจ๋ Room ์์ฑ์ try-with-resource ๋ธ๋ก์ผ๋ก ๊ฐ์๋ค๋ฉด ์๋ ์ฒญ์๋ ์ ํ ํ์ํ์ง ์๋ค.
'JAVA > Effective JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ดํํฐ๋ธ ์๋ฐ] Item08 ์๋ฒฝ๊ณต๋ต. Finalizer ๊ณต๊ฒฉ (0) | 2023.01.25 |
---|---|
[์ดํํฐ๋ธ ์๋ฐ] Item08 ์๋ฒฝ๊ณต๋ต (0) | 2023.01.25 |
[์ดํํฐ๋ธ ์๋ฐ] Item07 ์๋ฒฝ๊ณต๋ต. Executor (0) | 2023.01.21 |
[์ดํํฐ๋ธ ์๋ฐ] Item07 ์๋ฒฝ๊ณต๋ต. WeakHashMap (0) | 2023.01.21 |
[์ดํํฐ๋ธ ์๋ฐ] Item07 ์๋ฒฝ๊ณต๋ต.NullPointerException (0) | 2023.01.21 |