B. Eckel์ ์ ์ "Closures and Callbacks" ์ฃผ์ ์ ๋ํ "Inner Classes" ์ฅ์๋ ๋ค์ ์ฝ๋ ์์ ๊ฐ ๋์ ์์ต๋๋ค.
//innerclasses/Callbacks.java // ะัะฟะพะปัะทะพะฒะฐะฝะธะต ะฒะฝัััะตะฝะฝะธั
ะบะปะฐััะพะฒ // ะดะปั ัะตะฐะปะธะทะฐัะธะธ ะพะฑัะฐัะฝัั
ะฒัะทะพะฒะพะฒ package innerclasses; interface Incrementable { void increment(); } // ะะ ะะกะขะ ัะตะฐะปะธะทัะตะผ ะธะฝัะตััะตะนั: class Callee1 implements Incrementable { private int i = 0; public void increment() { i++; System.out.println(i); } } class MyIncrement { public void increment() { System.out.println("ะััะณะฐั ะพะฟะตัะฐัะธั"); } public static void f(MyIncrement mi) { mi.increment(); } } // ะัะปะธ ะฒะฐั ะบะปะฐัั ะดะพะปะถะตะฝ ะฒัะทัะฒะฐัั ะผะตัะพะด increment() // ะฟะพ-ะดััะณะพะผั, ะฝะตะพะฑั
ะพะดะธะผะพ ะธัะฟะพะปัะทะพะฒะฐัั ะฒะฝัััะตะฝะฝะธะน ะบะปะฐัั class Callee2 extends MyIncrement { private int i = 0; private void increment1() { super.increment(); i++; System.out.println(i); } private class Closure implements Incrementable { public void increment() { // ะฃะบะฐะทัะฒะฐะตััั ะผะตัะพะด ะฒะฝะตัะฝะตะณะพ ะบะปะฐััะฐ, ะธะฝะฐัะต // ะฒะพะทะฝะธะบะฐะตั ะฑะตัะบะพะฝะตัะฝะฐั ัะตะบัััะธั: Callee2.this.increment1(); } } Incrementable getCallbackReference() { return new Closure(); } } class Caller { private Incrementable callBackReference; Caller(Incrementable cbh) { callBackReference = cbh; } void go() { callBackReference.increment(); } } public class Callbacks { public static void main(String[] args) { Callee1 c1 = new Callee1(); Callee2 c2 = new Callee2(); MyIncrement.f(c2); Caller caller1 = new Caller(c1); Caller caller2 = new Caller(c2.getCallbackReference()); caller1.go(); caller1.go(); caller2.go(); caller2.go(); } }
์ปดํ์ผ๋ฌ๋ Callee2 ํด๋์ค์ increment() ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ ์ ์๋ค๊ณ ๋ณด๊ณ ํฉ๋๋ค. ๋ ๋ฎ์ ์ก์ธ์ค ๊ถํ์ ํ ๋นํ๋ ค๊ณ ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ์ดํดํ ์ ์์ต๋๋ค. Java์์๋ ์์ ์ค์ ๊ฐ์์ฑ์ ๋์ด๋ ๋ฐฉํฅ์ผ๋ก๋ง ์ก์ธ์ค ์์ ์๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์๊ฐ๊ฐ ์ ๋ฌํ๊ณ ์ถ์๋ ๊ฒ์ด ๋ฌด์์ธ์ง ๋งํด ๋ณด์ธ์. ์ฌ๊ธฐ์ ์คํ๊ฐ ์ด๋์ ์์ต๋๊น?
GO TO FULL VERSION