2023. 1. 25. 11:24ใJAVA/Effective JAVA
item08. finalizer์ cleaner ์ฌ์ฉ์ ํผํ๋ผ.
" p42. Finalizer ๊ณต๊ฒฉ"
https://hyejin.tistory.com/1011
์ฌ๊ธฐ์ finalizer๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๋ ์ด์ ์ค ํ๋๋ก "finalizer๋ฅผ ์ฌ์ฉํ ํด๋์ค๋ finalizer ๊ณต๊ฒฉ์ ๋ ธ์ถ๋์ด ์ฌ๊ฐํ ๋ณด์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ค" ๋ผ๊ณ ํ๋๋ฐ ์ด๋ finalizer ๊ณต๊ฒฉ์ ์์ฑ์๋ ์ง๋ ฌํ ๊ณผ์ ์์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด, ์ด ์์ฑ๋๋ค ๋ง ๊ฐ์ฒด์์ ์ ์์ ์ธ ํ์ ํด๋์ค์ finalizer๊ฐ ์ํ๋ ์ ์๊ฒ ๋๋ค๊ณ ํ๋ค.
public class Account {
private String accountId;
public Account(String accountId) {
this.accountId = accountId;
if (accountId.equals("aaa")) {
throw new IllegalArgumentException("aaa์ ๊ณ์ ์ ๋ง์ต๋๋ค.");
}
}
public void transfer(BigDecimal amount, String to) {
System.out.printf("transfer %f from %s to %s", amount, accountId, to);
}
}
์ด๋ ๊ฒ aaa์ ๊ณ์ ์ ๋ง๋ Account ํด๋์ค๊ฐ ์๊ณ , aaa๋ ๋ค๋ฅธ ์ฌ๋์๊ฒ ๊ณ์ข ์ด์ฒด๋ฅผ ๋ชปํ๊ฒ ํ๋ค.
class AccountTest {
@Test
void ์ผ๋ฐ_๊ณ์ () {
Account account = new Account("hyejin");
account.transfer(BigDecimal.valueOf(10.4), "hello");
}
@Test
void aaa_๊ณ์ () {
Account account = new Account("aaa");
account.transfer(BigDecimal.valueOf(10.4), "hello~");
}
}
๋ฐ๋ผ์ ์ผ๋ฐ ๊ณ์ ์ ํ ์คํธ ์ฑ๊ณตํ๋ ๋ฐ๋ฉด, aaa ๊ณ์ ์ ์คํจํ๋ค.
์ด๋ ๊ฒ ๋ณด๋ฉด aaa๋ ๊ณ์ ์ด ๋งํ ๊ณ์ข ์ด์ฒด๋ฅผ ํ ์ ์๋ ๊ฒ ๊ฐ์ ๋ณด์ด์ง๋ง
finalizer ๊ณต๊ฒฉ์ ์ฌ์ฉํ๋ฉด aaa๊ฐ ๊ณ์ข ์ด์ฒดํ ์ ์๊ฒ ํ ์ ์๋ค.
public class BrokenAccount extends Account {
public BrokenAccount(String accountId) {
super(accountId);
}
@Override
protected void finalize() throws Throwable {
this.transfer(BigDecimal.valueOf(100), "hyejin");
}
}
Account๋ฅผ ์์๋ฐ๋ ํด๋์ค๋ฅผ ํ๋ ๋ง๋ค๊ณ . finalize๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํด์ ์ฌ๊ธฐ์ transfer ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
@Test
void broken_aaa_๊ณ์ () throws InterruptedException {
Account account = null;
try {
account = new BrokenAccount("aaa");
} catch (Exception e) {
System.out.println("์ด๋ฌ๋ฉด???");
}
System.gc();
Thread.sleep(3000L); // gcํ๊ธฐ ์ํ ์๊ฐ
}
๊ทธ๋ฆฌ๊ณ ์ฐ์ null๋ก ๋ง๋ค๊ณ , aaa ๊ณ์ ์ IllegalArgumentException์ ๋ฐ์์ํค๋ฏ๋ก try-catch๋ก ์ก์์ฃผ๊ณ , gc๋ฅผ ์์์ํค๋ฉด
finalizer๊ฐ ๋์ํ๋ฉด์ transer ๋ฅผ ์คํํ๋ค..!
์ด๋ฐ finalizer ๊ณต๊ฒฉ์ ๋ง๊ธฐ ์ํด์๋ ๊ทธ๋ฅ Account ํด๋์ค ์์ฒด๋ฅผ final๋ก ํ์ฌ ์์๋ฐ์ง ๋ชปํ๊ฒ ํ ์๋ ์์ผ๋ฉฐ,
๊ทผ๋ฐ ์ด ํด๋์ค๊ฐ ์์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ธ์ผํ๋ค๋ฉด
public class Account {
private String accountId;
public Account(String accountId) {
this.accountId = accountId;
if (accountId.equals("aaa")) {
throw new IllegalArgumentException("aaa์ ๊ณ์ ์ ๋ง์ต๋๋ค.");
}
}
public void transfer(BigDecimal amount, String to) {
System.out.printf("transfer %f from %s to %s", amount, accountId, to);
}
@Override
protected final void finalize() throws Throwable {
// ์ค๋ฒ๋ผ์ด๋ฉ์ ํ์ฉํ์ง ์๋๋ก ๋ง์๋
}
}
์ด๋ ๊ฒ Account ํด๋์ค์์ finalize๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ๋ชปํ๊ฒ final๋ก ์ ์ธํด์ ๋ง์๋๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ํ ์คํธ๋ฅผ ํด๋ณด๋ฉด ์ด์ aaa๊ฐ ๊ณ์ข ์ด์ฒด๋ฅผ ํ์ง ๋ชปํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
'JAVA > Effective JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ดํํฐ๋ธ ์๋ฐ] Item9. try-finally ๋ณด๋ค๋ try-with-resources ๋ฅผ ์ฌ์ฉํ๋ผ. (0) | 2023.01.25 |
---|---|
[์ดํํฐ๋ธ ์๋ฐ] Item08 ์๋ฒฝ๊ณต๋ต. AutoClosable (0) | 2023.01.25 |
[์ดํํฐ๋ธ ์๋ฐ] Item08 ์๋ฒฝ๊ณต๋ต (0) | 2023.01.25 |
[์ดํํฐ๋ธ ์๋ฐ] Item8. finalizer์ cleaner ์ฌ์ฉ์ ํผํ๋ผ. (0) | 2023.01.22 |
[์ดํํฐ๋ธ ์๋ฐ] Item07 ์๋ฒฝ๊ณต๋ต. Executor (0) | 2023.01.21 |