2023. 3. 2. 16:56ใJAVA/Effective JAVA
item18. ์์๋ณด๋ค๋ ์ปดํฌ์ง์ ์ ์ฌ์ฉํ๋ผ.
" p.119 ์ฝ๋ฐฑ ํ๋ ์์ํฌ์ ์ ํ๋ฌธ์ "
๋ํผํด๋์ค์๋ ๋จ์ ์ด ๊ฑฐ์ ์๋๋ฐ, ํ๊ฐ์ง ์๋ค๋ฉด ๋ํผ ํด๋์ค๊ฐ ์ฝ๋ฐฑ callback ํ๋ ์์ํฌ์๋ ์ด์ธ๋ฆฌ์ง ์๋๋ค๋ ์ ๋ง ์ฃผ์ํ๋ฉด ๋๋ค.
์ฝ๋ฐฑ ํ๋ ์์ํฌ์์๋ ์๊ธฐ ์์ ์ ์ฐธ์กฐ๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋๊ฒจ์ ๋ค์ ํธ์ถ(์ฝ๋ฐฑ)๋ ์ฌ์ฉํ๋๋ก ํ๋ค.
๋ด๋ถ ๊ฐ์ฒด๋ ๊ทผ๋ฐ ์์ ์ ๊ฐ์ธ๊ณ ์๋ ๋ํผ์ ์กด์ฌ๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์๊ธฐ ์์ this๋ฅผ ์ฐธ์กฐ๋ก ๋๊ธฐ๊ณ , ์ฝ๋ฐฑ ๋๋ ๋ํผ๊ฐ ์๋ ๋ด๋ถ ๊ฐ์ฒด๋ฅผ ํธ์ถํ๊ฒ ๋๋๋ฐ ์ด๋ฅผ self ๋ฌธ์ ๋ผ๊ณ ํ๋ค.
์ฝ๋ฐฑ ํจ์๋?
: ๋ค๋ฅธ ํจ์ A์ ์ธ์๋ก ์ ๋ฌ๋ ํจ์ B๋ก, ํด๋น ํจ์A ๋ด๋ถ์์ ํ์ํ ์์ ์ ํธ์ถ๋ ์ ์๋ ํจ์ B๋ฅผ ์๋ฏธํ๋ค.
public interface FunctionToCall
{
void call();
void run();
}
class BobFunction implements FunctionToCall
{
private final Service service;
BobFunction(Service service)
{
this.service = service;
}
@Override
public void call()
{
System.out.println("----- call -----");
}
@Override
public void run()
{
this.service.run(this);
}
}
-> ์๊ธฐ ์์ this๋ฅผ ๋๊ฒจ์ ํ์ํ ๋ ํธ์ถํด ์ฌ์ฉํ๋๋ก ํ๋ค.
public class Service
{
public void run(FunctionToCall functionToCall)
{
System.out.println("------ do later ------");
functionToCall.call();
}
public static void main(String[] args)
{
Service service = new Service();
BobFunction bobFunction = new BobFunction(service);
bobFunction.run();
}
}
public class BobFunctionWrapper implements FunctionToCall
{
private final BobFunction bobFunction;
public BobFunctionWrapper(BobFunction bobFunction)
{
this.bobFunction = bobFunction;
}
@Override
public void call()
{
this.bobFunction.call();
System.out.println("----- another call -----");
}
@Override
public void run()
{
this.bobFunction.run();
}
}
๊ทผ๋ฐ ์ด์ ์ฌ๊ธฐ์ ๋ํผ ํฌ๋์ค๋ฅผ ๋ง๋ค์ด์ FunctionCall์ ๊ฐ์ธ๊ณ ,
public class Service
{
public void run(FunctionToCall functionToCall)
{
System.out.println("------ do later ------");
functionToCall.call();
}
public static void main(String[] args)
{
Service service = new Service();
BobFunction bobFunction = new BobFunction(service);
BobFunctionWrapper bobFunctionWrapper = new BobFunctionWrapper(bobFunction);
// bobFunction.run();
bobFunctionWrapper.run();
}
}
BobFunctionWrapper์์ run์ ํ๋ฉด ๋ด๋ถ ๊ฐ์ฒด๋ BobFunctionWrapper์ ์กด์ฌ๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์๊ธฐ ์์ bobFunction์ ๋๊ธฐ๊ณ , ์ฝ๋ฐฑ ๋๋ ๋ ํผ๊ฐ ์๋ ๋ด๋ถ ๊ฐ์ฒด๋ฅผ callํ๊ฒ ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ self ๋ฌธ์ ๋ผ๊ณ ํ๋ค.