도입
Interface가 가장 많이 사용되는 목적은 클래스 간의 데이터 전달일 것이다. 그 중에서도 Callback이라는 개념과 함께 interface가 가장 많이 사용된다. (현재까지 경험 상으로)
(인터페이스 사용 이유 - http://heepie.tistory.com/20,
콜백 개념 - http://heepie.tistory.com/60)
그래서 이번 포스팅에서는 인터페이스(Interface)와 콜백(Callback)을 실습할 예정이다.
실습
실습을 해보니 위와같이 구현하면 유지보수와 확장에 문제점이 발생할 수 있다는 생각이들었다.
이유는 Callback의 피드백을 받는 클래스(Local)에서 결과를 가공하면 이 후 Connector와 같은 클래스가 추가된다면 Local 클래스의 코드를 수정해야하기 때문이다.
Main.class
| public class Main { public static void main(String[] args) { Local local = new Local(); local.process(); } } | cs |
Local.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public class Local implements Connecter.ICallback { public void process() { Connecter p1 = new Connecter(); p1.process(this); for (int i=0; i<20; i=i+1) { System.out.println("Local 진행 중 .. " + i); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @Override public void finish(double randomValue) { String result = randomValue > 5.0 ? "===== Connection 성공 =====" : "===== Connection 실패 =====" ; System.out.println(result); } } | cs |
Connector.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public class Connecter { public void process(ICallback callBack) { double randomValue = Math.random() * 10; Thread process = new Thread () { public void run() { for (int i=0; i<10; i=i+1) { System.out.println("Connection 진행 중 .. " + i); try { sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } callBack.finish(randomValue); } }; process.start(); } public interface ICallback { void finish(double randomValue); } } | cs |
그래서 아래와 같이 수정했다.
Connector 클래스에서 결과에 대한 가공을 완료 후 일반적인 결과 값만 Local 클래스로 전송한다.
Main.class - 위와 동일
Local.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public class Local implements ICallback { public void process() { Connecter p1 = new Connecter(); p1.process(this); for (int i = 0; i < 20; i = i + 1) { System.out.println("Local 진행 중 .. " + i); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @Override public void callBackImpl(String result) { System.out.println(result); } } | cs |
Connector.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | public class Connecter { public void process(ICallback callBack) { double randomValue = Math.random() * 10; Thread process = new Thread() { public void run() { for (int i = 0; i < 10; i = i + 1) { System.out.println("Connection 진행 중 .. " + i); try { sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } callBack.callBackImpl(finish(randomValue)); } }; process.start(); } public String finish(double randomValue) { String result = randomValue > 5.0 ? "===== Connection 성공 =====" : "===== Connection 실패 ====="; return result; } } interface ICallback { void callBackImpl(String result); } | cs |
스크린 샷
#interface #callback #콜백 #인터페이스 #리스너
댓글