Java의 콜백 메커니즘 묘해 (CallBack)

앞말
최근에 자바를 배워서 리셋 메커니즘(CallBack)을 접했습니다.처음 만났을 때 혼란스러웠고 인터넷에서 검색한 설명은 한마디로 가져갔거나 단순히 Call Back에 대한 정의를 내린 것 같았다.그럼요. 제가 리셋을 이해한 후에 인터넷에서 여러 가지 설명을 보러 가면 확실히 아무런 문제가 없습니다.그러나 처음 배운 나에게는 순서에 따라 점진적인 과정이 부족하다.
리셋은 일종의 양방향 호출 모델이다. 무슨 뜻이냐. 즉, 피호출자는 호출될 때도 상대방을 호출한다. 이를 리셋이라고 한다.“If you call me, i will call back”.
이해 못해?괜찮아, 우선 이것을 보면 비교적 고전적인 리셋 방식을 사용할 수 있다.
class A 구현 인터페이스 InA – 배경 1
class A에는class B의 인용 b―배경2가 포함되어 있다
class B는 인자가 InA인 방법test(InA a)―배경3이 있습니다.
A의 대상 a가 B를 호출하는 방법은 자신에게 전송됩니다.test(a)―이 단계는 you call me에 해당합니다
그리고 b는 테스트 방법에서 InA의 방법을 호출할 수 있다. 이것은 icall you back에 해당한다.
시작하기 전에 유치원 어린이들이 방금 10 이내의 덧셈을 배웠다는 장면을 상상해 보세요.
다음은 제가 리셋 메커니즘에 대한 개인적인 이해를 얕은 순서에서 깊은 순서로 묘사하고 타당하지 않은 점이 있으면 아낌없이 가르침을 주시기 바랍니다!
제1장.사연
어린 선생님은 칠판에 "1+1="를 써서 시아오밍 학우가 빈칸을 메운다.
이미 10 이내의 덧셈을 배웠기 때문에 샤오밍 학우는 완전히 자신에 의지하여 이 문제를 계산할 수 있다. 이 과정을 모의하는 코드는 다음과 같다.

public class Student
 {
  private String name = null;

  public Student(String name)
  {
   // TODO Auto-generated constructor stub
   this.name = name;
  }

  public void setName(String name)
  {
   this.name = name;
  }

  private int calcADD(int a, int b)
  {
   return a + b;
  }

  public void fillBlank(int a, int b)
  {
   int result = calcADD(a, b);
   System.out.println(name + " :" + a + " + " + b + " = " + result);
  }
 }
시아오밍 학생은 빈칸을 채울 때 직접 계산(clacadd)을 한 결과 2가 나왔고 결과를 빈칸에 썼다.테스트 코드는 다음과 같습니다.

public class Test
 {
  public static void main(String[] args)
  {
  int a = 1;
   int b = 1;
   Student s = new Student(" ");
   s.fillBlank(a, b);
  }
 }
실행 결과는 다음과 같습니다.
소명 심산: 1 + 1 = 2
이 과정은 완전히 Student 클래스의 실례 대상에 의해 단독으로 완성되었고 리셋 메커니즘과 관련이 없다.
제2장.어린 스승의 트집을 잡다
수업 시간에 어린 선생님은 갑자기 칠판에'168+291='라고 써서 샤오밍을 완성시키고 사무실로 돌아갔다.
꽃 닦아!왜 모든 선생님들이 샤오밍과 사이가 좋지 않습니까?분명히 요강을 넘었으면 좋겠어!이때 샤오밍 학우는 위와 같이 속셈으로 완성할 수 없을 것이 분명하다. 어리둥절하고 있을 때 반의 샤오홍 학우는 덧셈만 할 수 있는 계산기(간상아)!!!샤오밍 학생은 마침 계산기를 어떻게 사용하는지 알고 계산기를 통해 결과를 얻어 빈칸을 채웠다.
계산기의 코드는 다음과 같습니다.

public class Calculator
 {
  public int add(int a, int b)
  {
   return a + b;
  }
 }
Student 클래스를 수정하고 계산기를 사용하는 방법을 추가합니다.

public class Student
 {
  private String name = null;

  public Student(String name)
  {
   // TODO Auto-generated constructor stub
   this.name = name;
  }

  public void setName(String name)
  {
   this.name = name;
  }

  @SuppressWarnings("unused")
  private int calcADD(int a, int b)
  {
   return a + b;
  }

  private int useCalculator(int a, int b)
  {
   return new Calculator().add(a, b);
  }

  public void fillBlank(int a, int b)
  {
   int result = useCalculator(a, b);
   System.out.println(name + " :" + a + " + " + b + " = " + result);
  }
 }
테스트 코드는 다음과 같습니다.

public class Test
 {
  public static void main(String[] args)
  {
   int a = 168;
   int b = 291;
   Student s = new Student(" ");
   s.fillBlank(a, b);
  }
 }
실행 결과는 다음과 같습니다.
시아오밍 사용 계산기: 168 + 291 = 459
이 과정에서 아직 리셋 메커니즘과 관련이 없지만 일부 소명의 일부 작업은 이미 이전을 실현했고 계산기가 협조하여 실현했다.
3. 어린 스승이 돌아왔다
시아오밍이 세 자릿수의 덧셈을 완성한 것을 발견하자 선생님은 시아오밍이 매우 총명하고 가소성이 있는 인재라고 생각하셨다.그래서 또 칠판에'26549+16487='라고 써서 샤오밍이 수업하기 전에 빈칸을 채우고 다시 사무실로 돌아갔다.
시아오밍은 교실 밖에서 즐겁게 노는 친구들을 보고 슬픔을 금치 못했다.더 이상 놀러 가지 않으면 이 수업은 폐교될 거야!!!샤오홍이 다시 건네준 계산기를 보고 샤오밍은 샤오홍이 대신 일하도록 했다.
샤오밍은 샤오홍에게 제목이'26549+16487='라고 알려주고 기입 결과의 구체적인 위치를 가리키며 즐겁게 놀러 나갔다.
여기에는 빨간색을 단독으로 실현하지 않고 가산법만 계산할 수 있는 이 계산기와 빨간색을 하나의 전체로 보고 계산 결과도 빈칸으로 채우는 슈퍼 계산기가 있다.이 슈퍼 계산기가 전해야 할 매개 변수는 두 개의 가수와 빈 자리를 채워야 한다. 이런 내용은 샤오밍이 미리 알려야 한다. 즉, 샤오밍은 자신의 일부 방법을 샤오홍에게 누설해야 한다. 가장 간단한 방법은 자신의 인용과 두 개의 가수를 함께 샤오홍에게 알려주는 것이다.
따라서 슈퍼 계산기의add 방법은 두 개의 조작수와 소명 자체의 인용을 포함해야 한다. 코드는 다음과 같다.

public class SuperCalculator
 {
  public void add(int a, int b, Student xiaoming)
  {
   int result = a + b;
   xiaoming.fillBlank(a, b, result);
  }
 }
샤오밍 이쪽은 이제 속셈도 필요 없고 계산기도 필요 없어요. 그래서 샤오홍에게 도움을 구할 수 있는 방법이 하나만 있으면 돼요. 코드는 다음과 같습니다.

public class Student
 {
  private String name = null;

  public Student(String name)
  {
   // TODO Auto-generated constructor stub
   this.name = name;
  }

  public void setName(String name)
  {
   this.name = name;
  }

  public void callHelp (int a, int b)
  {
   new SuperCalculator().add(a, b, this);
  }

  public void fillBlank(int a, int b, int result)
  {
   System.out.println(name + " :" + a + " + " + b + " = " + result);
  }
 }
테스트 코드는 다음과 같습니다.

public class Test
 {
  public static void main(String[] args)
  {
   int a = 26549;
   int b = 16487;
   Student s = new Student(" ");
   s.callHelp(a, b);
  }
 }
실행 결과:
소명 도움 요청 소홍 계산: 26549 + 16487 = 43036
실행 절차는 샤오밍이 자신의callHelp 방법을 통해 샤오홍(new SuperCalculator())의add 방법을 호출했고 호출할 때 자신의 인용(this)을 매개 변수로 함께 전송했다. 샤오홍은 계산기를 사용하여 결과를 얻은 후에 샤오밍의 fillBlank 방법을 조정하여 결과를 칠판의 빈칸에 기입했다.
등불, 등불!여기까지 리셋 기능이 정식으로 등장했습니다. 샤오밍의 fillBlank 방법은 우리가 흔히 말하는 리셋 함수입니다.
이런 방식을 통해 분명히 알 수 있듯이 선생님의 빈칸 채우기 문제를 완성하는 임무에 있어서 샤오밍은 덧셈을 다 할 때까지 기다릴 필요가 없고 결과를 칠판에 기입해야만 친구들과 즐겁게 지낼 수 있다. 빈칸 채우기 작업은 슈퍼 계산기 샤오홍이 한다.리셋의 우세는 이미 구현되기 시작했다.
제4장.입구의 시어머니
유치원 입구에는 머리카락이 희끗희끗한 할머니가 매일 비바람을 무릅쓰고 그곳에 노점을 벌여 유통기한이 다 된 쓰레기 식품을 팔고 있다.나이가 많아서 머리가 흐리멍덩해서 자신이 얼마를 벌었는지 계산이 잘 안 되는 경우가 많다.어느 날, 그녀는 무의식중에 샤오밍이 젊은이들과 어떻게 샤오홍의 도움으로 어린 스승과 지혜와 용기를 겨루는지 허풍을 떨었다는 것을 들었다.그래서 시어머니는 레드카드 슈퍼계산기를 찾아 자신의 조수로 삼고 위룡 매운 튀김 한 봉지를 보상하기로 했다.샤오홍은 유혹을 견디지 못하고 승낙했다.
지난 장의 코드를 돌이켜 보면 빨간색 슈퍼 계산기의add 방법에 필요한 매개 변수는 두 개의 정형 변수와 한 Student 대상이지만 할머니는 학생이 아니라 소상인입니다. 여기는 반드시 수정해야 합니다.이런 상황에서 우리는 자연스럽게 계승과 다태를 생각할 것이다.만약 시아오밍이라는 학생과 할머니라는 소상인을 한 부류에서 계승하게 한다면, 우리는 레드카드 슈퍼 계산기에 부류의 인용을 전하기만 하면 된다.
그러나 실제 사용에서 자바의 단일 계승과 자신에게 너무 많은 것을 남에게 누설하기를 원하지 않는 것을 고려하여 인터페이스에서 계승하는 방식으로 내부류와 협조하여 한다.
다시 말하면 샤오홍은 앞으로도 반 어린이들에게 계산 서비스를 계속 제공하고 할머니에게 계산 서비스를 제공할 수 있으며 심지어 앞으로 다른 사람의 업무를 확대할 수 있기를 희망한다. 그래서 그녀는 모든 고객에게 통일된 처리, 즉 자신이 필요로 하는 조작 수와 계산을 끝낸 후에 어떻게 해야 하는지 방법을 약속했다.이 통일된 방법은 샤오홍이 인터페이스를 만들어 모두에게 제공했다. 코드는 다음과 같다.

public interface doJob
 {
  public void fillBlank(int a, int b, int result);
 }
영감은 샤오밍을 도와 빈칸을 채우는 것이기 때문에 샤오홍은 초심을 보류하고 모든 업무를 빈칸으로 삼는다.
또한 샤오홍은 자신의 계산기를 수정하여 서로 다른 DoJob 인터페이스를 실현한 사람을 동시에 처리할 수 있도록 했다. 코드는 다음과 같다.

public class SuperCalculator
 {
  public void add(int a, int b, doJob customer)
  {
   int result = a + b;
   customer.fillBlank(a, b, result);
  }
 }
샤오밍과 할머니가 이 인터페이스를 얻은 후에 이 인터페이스를 실현하면 통일된 모델에 따라 샤오홍에게 결과를 얻은 후의 처리 방법을 알려주고 앞서 말한 내부 클래스를 사용하는 것과 같다. 코드는 다음과 같다.
샤오밍:

public class Student
 {
  private String name = null;

  public Student(String name)
  {
   // TODO Auto-generated constructor stub
   this.name = name;
  }

  public void setName(String name)
  {
   this.name = name;
  }

  public class doHomeWork implements doJob
  {

   @Override
   public void fillBlank(int a, int b, int result)
   {
    // TODO Auto-generated method stub
    System.out.println(name + " :" + a + " + " + b + " = " + result);
   }

  }

  public void callHelp (int a, int b)
  {
   new SuperCalculator().add(a, b, new doHomeWork());
  }
 }
할머니:

public class Seller
{
 private String name = null;

 public Seller(String name)
 {
  // TODO Auto-generated constructor stub
  this.name = name;
 }

 public void setName(String name)
 {
  this.name = name;
 }

 public class doHomeWork implements doJob
 {

  @Override
  public void fillBlank(int a, int b, int result)
  {
   // TODO Auto-generated method stub
   System.out.println(name + " :" + a + " + " + b + " = " + result + " ");
  }

 }

 public void callHelp (int a, int b)
 {
  new SuperCalculator().add(a, b, new doHomeWork());
 }
}
테스트 프로그램은 다음과 같습니다.

public class Test
{
 public static void main(String[] args)
 {
  int a = 56;
  int b = 31;
  int c = 26497;
  int d = 11256;
  Student s1 = new Student(" ");
  Seller s2 = new Seller(" ");

  s1.callHelp(a, b);
  s2.callHelp(c, d);
 }
}
실행 결과는 다음과 같습니다.
샤오밍 도움 요청 샤오홍 계산: 56 + 31 = 87
할머니가 도움을 청하여 샤오홍의 계산:26497+11256=37753원
총결산
분명히 볼 수 있듯이 샤오홍은 이미 이 일을 하나의 사업으로 삼아 했다. 그녀가 인터페이스 이름을 준 DoJob을 보면 알 수 있다.
어떤 사람은 아마도 왜 할머니가 노점을 벌여 그렇게 많은 돈을 벌 수 있느냐고 물어볼 것이다.당신의 관심사에 문제가 있습니까!!여기서 얘기하는 건 리셋 메커니즘이야!!
나는 나중에 샤오홍의 업무가 끊임없이 확대되어 마침내 유치원을 졸업하기 전에 번 돈으로 인생의 첫 집을 샀다는 것만 알았다.
이상은 본고가 자바의 리셋 메커니즘(Call Back)에 대한 재미있는 설명입니다. 여러분에게 자바를 배우는 데 도움이 되었으면 합니다.저희에 대한 여러분의 지지에도 감사드립니다.

좋은 웹페이지 즐겨찾기