"์•ˆ๋…•, ์•„๋ฏธ๊ณ ."

"์•ˆ๋…•, ๋ฆฌ์‹œ."

"์˜ค๋Š˜ ์ €๋Š” ์ƒˆ๋กญ๊ณ  ๋งค์šฐ ํฅ๋ฏธ๋กœ์šด ์ฃผ์ œ์ธ ๋™์  ํ”„๋ก์‹œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค." .

"Java์—๋Š” ํŠน์ • ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹คโ€ฆ"

"์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ์ƒ์†์ž…๋‹ˆ๋‹ค."

"ํด๋ž˜์Šค์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ์›๋ž˜(๊ธฐ๋ณธ) ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ์ƒˆ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์›๋ž˜ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ํŒŒ์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค."

Reader reader = new UserCustomReader();

"๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ๋ž˜ํผ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค."

" BufferedReader ๋Š” ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ํด๋ž˜์Šค์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์ฒซ์งธ, Reader๋ฅผ ์ƒ์† ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, Reader ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜์งธ, BufferedReader ๊ฐ์ฒด์˜ ์ƒ์„ฑ์ž๋กœ ์ „๋‹ฌ๋˜์–ด์•ผ ํ•˜๋Š” ์›๋ž˜ Reader ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ชจ๋“  ํ˜ธ์ถœ์„ ๋ฆฌ๋””๋ ‰์…˜ํ•ฉ๋‹ˆ๋‹ค. . ์˜ˆ๋ฅผ ๋“ค์–ด:"

Reader readerOriginal = new UserCustomReader();
Reader reader = new BufferedReader(readerOriginal);

"์„ธ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ๋™์  ํ”„๋ก์‹œ(Proxy)๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค."

"Java(java.lang.reflect.Proxy)์—๋Š” ๋ณ„๋„์˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ ๋„ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์—(๋™์ ์œผ๋กœ) ๊ฐœ์ฒด๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ˆ˜ ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ."

"์ด ์ž‘์—…์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค."

Reader reader = (Reader)Proxy.newProxyInstance();

"๊ทธ๊ฒƒ์€ ์ด๋ฏธ ๋‚˜์—๊ฒŒ ์ƒˆ๋กœ์šด ๊ฒƒ์ž…๋‹ˆ๋‹ค!"

"ํ•˜์ง€๋งŒ ๋ฌผ๋ก  ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋Š” ๊ฐœ์ฒด๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฐœ์ฒด๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์›ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๊ฐœ์ฒด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Java๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ๋Š” InvocationHandler๋ผ๋Š” ํŠน์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉ ํ•ฉ๋‹ˆ๋‹ค . ํ”„๋ก์‹œ ๊ฐœ์ฒด์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค . ํ”„๋ก์‹œ ๊ฐœ์ฒด๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."

" Invoke โ€“ ์ฃผ์š” ์ž‘์—…์ด ๋‹จ์ˆœํžˆ ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ธ ๋ฉ”์„œ๋“œ ๋˜๋Š” ํด๋ž˜์Šค์˜ ํ‘œ์ค€ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."

" ํ•ธ๋“ค๋Ÿฌ โ€“ ์ผ๋ถ€ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค์˜ ํ‘œ์ค€ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋งˆ์šฐ์Šค ํด๋ฆญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค๋Š” MouseClickHandler ๋“ฑ์œผ๋กœ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค."

"InvocationHandler ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ํ”„๋ก์‹œ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ๋ชจ๋“  ํ˜ธ์ถœ์ด ์ „๋‹ฌ๋˜๋Š” ๋‹จ์ผ ํ˜ธ์ถœ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค . ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค."

์•”ํ˜ธ
Reader reader = (Reader)Proxy.newProxyInstance(new CustomInvocationHandler());
reader.close();
class CustomInvocationHandler implements InvocationHandler
{
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
 {
  System.out.println("yes!");
  return null;
 }
}

" reader . close () ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด invoke ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ํ™”๋ฉด์— 'yes!'๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค."

"๊ทธ๋ž˜์„œ CustomInvocationHandler ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•˜๊ณ  InvocationHandler ์ธํ„ฐํŽ˜์ด์Šค์™€ ํ•ด๋‹น invoke ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. invoke ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด 'yes!'๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ CustomInvocationHandler ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ƒ์„ฑ ์‹œ newProxyInstance ๋ฉ”์„œ๋“œ ์— ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ก์‹œ ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค."

"๋„ค, ๋ชจ๋‘ ๋งž์Šต๋‹ˆ๋‹ค."

"์ด๊ฒƒ์€ ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ํ”„๋ก์‹œ๋Š” ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์—์„œ ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐœ์ฒด๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ดํŠธํ•˜๊ฑฐ๋‚˜ ์•ก์„ธ์Šค๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค  ."

"์ด ๋ฐฉ๋ฒ•์—์„œ ํ˜„์žฌ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ํ™•์ธํ•˜๊ณ , ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."

"๋‹ค์Œ์€ invoke ๋ฉ”์†Œ๋“œ๊ฐ€ ์›๋ž˜ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์˜ˆ์ž…๋‹ˆ๋‹ค."

์•”ํ˜ธ
Reader original = new UserCustomReader();

Reader reader = (Reader)Proxy.newProxyInstance(new CustomInvocationHandler(original));
reader.close();
class CustomInvocationHandler implements InvocationHandler
{
 private Reader readerOriginal;

 CustomInvocationHandler(Reader readerOriginal)
 {
  this.readerOriginal = readerOriginal;
 }

 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
 {
  if (method.getName().equals("close"))
  {
   System.out.println("Reader closed!");
  }

  // This calls the readerOriginal object's close method.
  // The method's name and a description of its parameters are stored in the method variable.
  return method.invoke(readerOriginal, args);
 }
}

"์ด ์˜ˆ์—๋Š” ๋‘ ๊ฐ€์ง€ ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค."

"๋จผ์ € ยซ์›๋ณธยป Reader ๊ฐœ์ฒด๊ฐ€ ์ƒ์„ฑ์ž์— ์ „๋‹ฌ๋˜๊ณ  ์ด์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ CustomInvocationHandler ๋‚ด๋ถ€์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค . "

"๋‘ ๋ฒˆ์งธ๋กœ, invoke ๋ฉ”์„œ๋“œ์—์„œ ์ด ๋™์ผํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์ง€๋งŒ ์ด๋ฒˆ์—๋Š” ยซ์›๋ณธยป ๊ฐœ์ฒด์—์„œ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค."

"์•„. ์ฆ‰, ์ด ๋งˆ์ง€๋ง‰ ์ค„์€ ๋™์ผํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€๋งŒ ์›๋ž˜ ๊ฐœ์ฒด์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค."

return method.invoke(readerOriginal, args);

"๋„ค."

"๋งค์šฐ ๋ช…๋ฐฑํ•˜๋‹ค๊ณ  ๋งํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์—ฌ์ „ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๊ทธ๋ ‡๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค."

"์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•œ ๊ฐ€์ง€ ๋”. newProxyInstance ๋ฉ”์„œ๋“œ์—์„œ ํ”„๋ก์‹œ ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๊ด€๋ฆฌ ์ •๋ณด๋ฅผ ์กฐ๊ธˆ ๋” ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์—„์ฒญ๋‚œ ํ”„๋ก์‹œ ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ •๋ณด๋Š” ์›๋ž˜ ํด๋ž˜์Šค ์ž์ฒด์—์„œ ์‰ฝ๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "

"์—ฌ๊ธฐ ๋˜ ๋‹ค๋ฅธ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค."

์•”ํ˜ธ
Reader original = new UserCustomReader();

ClassLoader classLoader = original.getClass().getClassLoader();
Class<?>[] interfaces = original.getClass().getInterfaces();
CustomInvocationHandler invocationHandler = new CustomInvocationHandler(original);

Reader reader = (Reader)Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
class CustomInvocationHandler implements InvocationHandler
{
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
 {
  return null;
 }
}

"์•„. ClassLoader์™€ ์ธํ„ฐํŽ˜์ด์Šค ๋ชฉ๋ก. ์ด๊ฒƒ์€ Reflection์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ ์•„๋‹Œ๊ฐ€์š”?"

"๋„ค."

"๊ทธ๋ ‡๊ตฐ์š”. ์Œ, ํ•„์š”ํ•˜๋‹ค๋ฉด ์›์‹œ์ ์ด๊ณ  ๋งค์šฐ ๊ฐ„๋‹จํ•œ ํ”„๋ก์‹œ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค."

"๊ทธ๋Ÿผ ๋””์—๊ณ ์—๊ฒŒ ๊ฐ€์„œ ํ™•์ธํ•ด๋ด."