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)๋Š” ์•ˆ์ „๋ง ์—ญํ• ์ด๋‹ˆ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๋„ค์ดํ‹ฐ๋ธŒ ์ž์› ํšŒ์ˆ˜์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•˜์ž. ๋ฌผ๋ก  ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ผ๋„ ๋ถˆํ™•์‹ค์„ฑ๊ณผ ์„ฑ๋Šฅ ์ €ํ•˜์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.