item 8 incheol - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
์์ดํ 8 finalizer์ cleaner ์ฌ์ฉ์ ํผํ๋ผ
Effective Java 3e ์์ดํ 8๋ฅผ ์์ฝํ ๋ด์ฉ ์ ๋๋ค.
์๋ฐ๋ ๋ ๊ฐ์ง ๊ฐ์ฒด ์๋ฉธ์๋ฅผ ์ ๊ณตํ๋ค. ๊ทธ์ค finalizer๋ ์์ธกํ ์ ์๊ณ , ์ํฉ์ ๋ฐ๋ผ ์ํํ ์ ์์ด ์ผ๋ฐ์ ์ผ๋ก ๋ถํ์ํ๋ค. finalizer๋ ๋๋ฆ์ ์ฐ์์๊ฐ ๋ช ๊ฐ์ง ์๊ธด ํ์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก '์ฐ์ง ๋ง์์ผ' ํ๋ค. ๊ทธ๋์ ์๋ฐ 9์์๋ finalizer๋ฅผ ์ฌ์ฉ ์์ (deprecated) API๋ก ์ง์ ํ๊ณ cleaner๋ฅผ ๊ทธ ๋์์ผ๋ก ์๊ฐํ๋ค. cleaner๋ finalizer๋ณด๋ค๋ ๋ ์ํํ์ง๋ง, ์ฌ์ ํ ์์ธกํ ์ ์๊ณ , ๋๋ฆฌ๊ณ , ์ผ๋ฐ์ ์ผ๋ก ๋ถํ์ํ๋ค.
์๋ฐ์์๋ try-with-resources์ try-finally๋ฅผ ์ฌ์ฉํด ํด๊ฒฐํ๋ค.
finalizer์ cleaner๋ ์ฆ์ ์ํ๋๋ค๋ ๋ณด์ฅ์ด ์๋ค. ์ผ๋ง๋ ์ ์ํ ์ํํ ์ง๋ ์ ์ ์ผ๋ก ๊ฐ๋น์ง ์ปฌ๋ ํฐ ์๊ณ ๋ฆฌ์ฆ์ ๋ฌ๋ ธ์ผ๋ฉฐ, ์ด๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ ๊ตฌํ๋ง๋ค ์ฒ์ฐจ๋ง๋ณ์ด๋ค. ๊ทธ๋์ ํด๋์ค์ finalizer๋ฅผ ๋ฌ์๋๋ฉด ๊ทธ ์ธ์คํด์ค์ ์์ ํ์๊ฐ ์ ๋ฉ๋๋ก ์ง์ฐ๋ ์ ์๋ค.
ํํธ, cleaner๋ ์์ ์ ์ํํ ์ค๋ ๋๋ฅผ ์ ์ดํ ์ ์๋ค๋ ๋ฉด์์ ์กฐ๊ธ ๋ซ๋ค. ํ์ง๋ง ์ฌ์ ํ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ํ๋๋ฉฐ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ํต์ ํ์ ์์ผ๋ ์ฆ๊ฐ ์ํ๋๋ฆฌ๋ผ๋ ๋ณด์ฅ์ ์๋ค.
๋ฐ๋ผ์ ํ๋ก๊ทธ๋จ ์์ ์ฃผ๊ธฐ์ ์๊ด์๋ ์ํ๋ฅผ ์๊ตฌ์ ์ผ๋ก ์์ ํ๋ ์์ ์์๋ ์ ๋ finalizer๋ cleaner์ ์์กดํด์๋ ์ ๋๋ค.
finalizer์ ๋ถ์์ฉ์ ์ฌ๊ธฐ์ ๋์ด ์๋๋ค. finalizer ๋์ ์ค ๋ฐ์ํ ์์ธ๋ ๋ฌด์๋๋ฉฐ, ์ฒ๋ฆฌํ ์์ ์ด ๋จ์๋๋ผ๋ ๊ทธ ์๊ฐ ์ข ๋ฃ๋๋ค. ์ก์ง ๋ชปํ ์์ธ ๋๋ฌธ์ ํด๋น ๊ฐ์ฒด๋ ์์นซ ๋ง๋ฌด๋ฆฌ๊ฐ ๋ ๋ ์ํ๋ก ๋จ์ ์ ์๋ค. ๋ณดํต์ ๊ฒฝ์ฐ์ ์ก์ง ๋ชปํ ์์ธ๊ฐ ์ค๋ ๋๋ฅผ ์ค๋จ์ํค๊ณ ์คํ ์ถ์ ๋ด์ญ์ ์ถ๋ ฅํ๊ฒ ์ง๋ง, ๊ฐ์ ์ผ์ด finalizer์์ ์ผ์ด๋๋ค๋ฉด ๊ฒฝ๊ณ ์กฐ์ฐจ ์ถ๋ ฅํ์ง ์๋๋ค.
AutoCloseable ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์๊ฑฐํ๊ธฐ๊น์ง 12ns๊ฐ ๊ฑธ๋ฆฐ ๋ฐ๋ฉด finalizer๋ฅผ ์ฌ์ฉํ๋ฉด 550ns๊ฐ ๊ฑธ๋ ธ๋ค. ๋ค์ ๋งํด finalizer๋ฅผ ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํ๊ดดํ๋ 50๋ฐฐ๋ ๋๋ ธ๋ค. finalizer๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ํจ์จ์ ๋จ์ด๋จ๋ฆฌ๊ธฐ ๋๋ฌธ์ด๋ค.
finalizer๊ฐ ํจ์จ์ ์ด๋ป๊ฒ ๋จ์ด๋จ๋ฆฌ๋์ง ๊ตฌ์ฒด์ ์ธ ์ฌ๋ก๋ฅผ ์ ์ ์์๊น?
finalizer๋ฅผ ์ฌ์ฉํ ํด๋์ค๋ finalizer ๊ณต๊ฒฉ์ ๋ ธ์ถ๋์ด ์ฌ๊ฐํ ๋ณด์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์๋ ์๋ค. ์์ฑ์๋ ์ง๋ ฌํ ๊ณผ์ ์์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ์ด ์์ฑ๋๋ค ๋ง ๊ฐ์ฒด์์ ์ ์์ ์ธ ํ์ ํด๋์ค์ finalizer๊ฐ ์ํ๋ ์ ์๊ฒ ๋๋ค. final์ด ์๋ ํด๋์ค๋ฅผ finalizer ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ๋ฐฉ์ดํ๋ ค๋ฉด ์๋ฌด ์ผ๋ ํ์ง ์๋ finalize ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ final๋ก ์ ์ธํ์
finalizer์ ๊ตฌ์ฒด์ ์ธ ๋ณด์ ์ด์๋?
๊ทธ์ AutoCloseable์ ๊ตฌํํด์ฃผ๊ณ ํด๋ผ์ด์ธํธ์์ ์ธ์คํด์ค๋ฅผ ๋ค ์ฐ๊ณ ๋๋ฉด close ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๋๋ค. close ๋ฉ์๋์์ ์ด ๊ฐ์ฒด๋ ๋ ์ด์ ์ ํจํ์ง ์์์ ํ๋์ ๊ธฐ๋กํ๊ณ ๋ค๋ฅธ ๋ฉ์๋๋ ์ด ํ๋๋ฅผ ๊ฒ์ฌํด์ ๊ฐ์ฒด๊ฐ ๋ซํ ํ์ ๋ถ๋ ธ๋ค๋ฉด IlligalStateException์ ๋์ง๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด cleaner์ finalizer๋ ๋ฌด์จ ์ฉ๋๋ก ์ฌ์ฉํ ์ ์์๊น?
ํ๋๋ ์์์ ์์ ์๊ฐ close ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์๋ ๊ฒ์ ๋๋นํ ์์ ๋ง ์ญํ ์ด๋ค. cleaner๋ finalizer๊ฐ ์ฆ์ (ํน์ ๋๊น์ง) ํธ์ถ๋๋ฆฌ๋ผ๋ ๋ณด์ฅ์ ์์ง๋ง, ํด๋ผ์ด์ธํธ๊ฐ ํ์ง ์์ ์์ ํ์๋ฅผ ๋ฆ๊ฒ๋ผ๋ ํด์ฃผ๋ ๊ฒ์ด ์์ ์ ํ๋ ๊ฒ๋ณด๋ค๋ ๋์ผ๋ ๋ง์ด๋ค?
cleaner์ finalizer๋ฅผ ์ ์ ํ ํ์ฉํ๋ ๋ ๋ฒ์งธ ์๋ ๋ค์ดํฐ๋ธ ํผ์ด์ ์ฐ๊ฒฐ๋ ๊ฐ์ฒด์์๋ค.
๋ค์ดํฐ๋ธ ํผ์ด๋ ์ผ๋ฐ ์๋ฐ ๊ฐ์ฒด๊ฐ ๋ค์ดํฐ๋ธ ๋ฉ์๋๋ฅผ ํตํด ๊ธฐ๋ฅ์ ์์ํ ๋ค์ดํฐ๋ธ ๊ฐ์ฒด๋ฅผ ๋งํ๋ค. ๋ค์ดํฐ๋ธ ํผ์ด๋ ์๋ฐ ๊ฐ์ฒด๊ฐ ์๋๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๊ทธ ์กด์ฌ๋ฅผ ์์ง ๋ชปํ๋ค.
์ฑ๋ฅ ์ ํ๋ฅผ ๊ฐ๋นํ ์ ์๊ฑฐ๋ ๋ค์ดํฐ๋ธ ํผ์ด๊ฐ ์ฌ์ฉํ๋ ์์์ ์ฆ์ ํ์ํด์ผ ํ๋ค๋ฉด ์์ ์ค๋ช ํ close ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
๋ง์ฝ ์์ ๋ง์ผ๋ก ์ฌ์ฉํ๊ณ ์ถ์ง ์๋ค๋ฉด ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑ ํ๋ฉด ๋ ๊ฒ์ด๋ค.
public class Adult {
public static void main(String[] args) {
try (Room myRoom = new Room(7)) {
System.out.println("์๋
~");
}
}
}
์ ๋ฆฌ
cleaner(์๋ฐ 8๊น์ง๋ finalizer)๋ ์์ ๋ง ์ญํ ์ด๋ ์ค์ํ์ง ์์ ๋ค์ดํฐ๋ธ ์์ ํ์์ฉ์ผ๋ก๋ง ์ฌ์ฉํ์. ๋ฌผ๋ก ์ด๋ฐ ๊ฒฝ์ฐ๋ผ๋ ๋ถํ์ค์ฑ๊ณผ ์ฑ๋ฅ ์ ํ์ ์ฃผ์ํด์ผ ํ๋ค.