|
| 1 | +# finalizer์ cleaner ์ฌ์ฉ์ ํผํ๋ผ. |
| 2 | + |
| 3 | +## ์๋ฐ์ ๊ฐ์ฒด ์๋ฉธ์ finalizer์ cleaner |
| 4 | + |
| 5 | +- finalizer : ์์ธกํ ์ ์๊ณ , ์ํฉ์ ๋ฐ๋ผ ์ํํ ์ ์์ด ์ผ๋ฐ์ ์ผ๋ก ๋ถํ์ํ๋ค. |
| 6 | +- cleaner : finalizer๋ณด๋ค ๋ ์ํํ์ง๋ง, ์ฌ์ ํ ์์ธกํ ์ ์๊ณ , ๋๋ฆฌ๊ณ ์ผ๋ฐ์ ์ผ๋ก ๋ถํ์ํ๋ค. |
| 7 | + |
| 8 | +> ์ cleaner๋ณด๋ค finalizer๊ฐ ๋ ์ํํ ๊น? finalizer์์๋ ์ค๋ ๋๋ฅผ ํต์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฒฝ๊ณ ๋ฅผ ์ถ๋ ฅํ์ง ์๊ณ , ์ข
๋ฃํด๋ฒ๋ฆฌ์ง๋ง, cleaner๋ฅผ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์ ์ ์ค๋ ๋๋ฅผ ํต์ ํ๊ธฐ ๋๋ฌธ์ด๋ค. |
| 9 | +
|
| 10 | +## ์ ์ง์ํด์ผ ํ๋๊ฐ? |
| 11 | + |
| 12 | +1. ์ฆ์ ์ํ๋๋ค๋ ๋ณด์ฅ์ด ์๋ค. |
| 13 | +- finalizer๋ cleaner๋ฅผ ์ผ๋ง๋ ์ ์ํ ์ํํ ์ง๋ ์ ์ ์ผ๋ก ๊ฐ๋น์ง ์ปฌ๋ ์
์ ๋ฌ๋ ธ๋ค. |
| 14 | +2. ์ํ ์ฌ๋ถ๋ ๋ณด์ฅํ์ง ์๋๋ค. |
| 15 | +- ์ ๊ทผ ํ ์ ์๋ ์ผ๋ถ ๊ฐ์ฒด์ ๋ธ๋ฆฐ ์ข
๋ฃ ์์
์ ์ ํ ์ํํ์ง ๋ชปํ ์ฑ ํ๋ก๊ทธ๋จ์ด ์ค๋จ ๋ ์๋ ์๋ค. |
| 16 | +- ์ฆ, ์ํ๋ฅผ ์๊ตฌ์ ์ผ๋ก ์์ ํ๋ ์์
์์๋ ์ ๋ finalizer๋ cleaner์ ์์กดํด์๋ ์ ๋๋ค. |
| 17 | +3. ์ฌ๊ฐํ ์ฑ๋ฅ ๋ฌธ์ ๋ ๋๋ฐํ๋ค. |
| 18 | +- AutoCloseable ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํ์๋๋ณด๋ค ์ฝ 50๋ฐฐ ๋๋ฆฌ๋ค. |
| 19 | +4. finalizer๋ฅผ ์ฌ์ฉํ ํด๋์ค๋ finalizer ๊ณต๊ฒฉ์ ๋
ธ์ถ๋์ด ์ฌ๊ฐํ ๋ณด์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์๋ ์๋ค. |
| 20 | +- ์์ฑ์๋ ์ง๋ ฌํ ๊ณผ์ ์์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด, ์ด ์์ฑ๋๋ค ๋ง ๊ฐ์ฒด์์ ์
์์ ์ธ ํ์ ํด๋์ค์ finalizer๊ฐ ์ํ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์์งํ์ง ๋ชปํ๊ฒ ๋ง์ ์ ์๋ค. |
| 21 | + |
| 22 | +## ์ด๋ ๊ฒ ์ง์ํ๋๋ฐ ์ finalizer์ cleaner๊ฐ ์๋๊ฑด๋ฐ? |
| 23 | + |
| 24 | +1. ์์์ ์์ ์๊ฐ close ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์๋ ๊ฒ์ ๋๋นํ ์์ ๋ง ์ญํ |
| 25 | +2. ๋ค์ดํฐ๋ธ ํผ์ด๋ฅผ ํ์ํ๊ธฐ ์ํด์์ด๋ค. ์๋ํ๋ฉด ๋ค์ดํฐ๋ธ ํผ์ด๋ ์๋ฐ ๊ฐ์ฒด๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์์ ํ์ํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ด๋ค. |
| 26 | +- ์ฆ์ ์์์ ํ์ํด์ผ ํ๋ค๋ฉด close ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผํ๋ค. |
| 27 | + |
| 28 | +## finalizer๋ cleaner๋ฅผ ๋์ ํด์ค ๋ฌ์์ ๋ฌด์์ผ๊น? |
| 29 | + |
| 30 | +1. **AutoCloseable์ ๊ตฌํํด์ฃผ๊ณ , ํด๋ผ์ด์ธํธ์์ ์ธ์คํด์ค๋ฅผ ๋ค ์ฐ๊ณ ๋๋ฉด close ๋ฉ์๋๋ฅผ ํธ์ถํด์ฃผ๋ฉด ๋๋ค.** |
| 31 | + |
| 32 | +2. **AutoCloseable์์ Cleaner๋ฅผ ์ฌ์ฉํ์ฌ ํด์ฃผ๋ ๊ฒฝ์ฐ, try-with-resources์ ์ฌ์ฉํ์.** |
| 33 | + |
| 34 | + |
| 35 | + ## ์ฑ
์์ |
| 36 | + |
| 37 | + import java.lang.ref.Cleaner; |
| 38 | + |
| 39 | + public class Room implements AutoCloseable { |
| 40 | + |
| 41 | + private static final Cleaner cleaner = Cleaner.create(); |
| 42 | + |
| 43 | + private static class State implements Runnable { |
| 44 | + int numJunkpiles; |
| 45 | + |
| 46 | + State(int numJunkpiles) { |
| 47 | + this.numJunkpiles = numJunkpiles; |
| 48 | + } |
| 49 | + |
| 50 | + @Override |
| 51 | + public void run() { |
| 52 | + System.out.println("๋ฐฉ ์ฒญ์"); |
| 53 | + numJunkpiles = 0; |
| 54 | + } |
| 55 | + } |
| 56 | + private final State state; |
| 57 | + private final Cleaner.Cleanable cleanable; |
| 58 | + |
| 59 | + public Room(int numJunkpiles) { |
| 60 | + state = new State(numJunkpiles); |
| 61 | + cleanable = cleaner.register(this, state); |
| 62 | + } |
| 63 | + |
| 64 | + @Override |
| 65 | + public void close() throws Exception { |
| 66 | + cleanable.clean(); |
| 67 | + } |
| 68 | + } |
| 69 | + |
| 70 | + public class main { |
| 71 | + public static void main(String[] args) throws Exception { |
| 72 | + try (Room myRoom = new Room(7)) { |
| 73 | + System.out.println("์๋
~"); |
| 74 | + } |
| 75 | + new Room(99); |
| 76 | + System.out.println("์๋ฌด๋ ด~"); |
| 77 | + } |
| 78 | + |
| 79 | +๊ฒฐ๊ณผ : |
| 80 | + |
| 81 | + ์๋
~ |
| 82 | + ๋ฐฉ์ฒญ์ |
| 83 | + ์๋ฌด๋ ด |
| 84 | + |
| 85 | + |
| 86 | + |
| 87 | + |
| 88 | + |
| 89 | + |
| 90 | + |
| 91 | + |
| 92 | + |
| 93 | + |
0 commit comments