>  기사  >  Java  >  Java 콜백 함수에 대해 다시 이야기해 봅시다.

Java 콜백 함수에 대해 다시 이야기해 봅시다.

高洛峰
高洛峰원래의
2017-01-24 13:41:19968검색

또 콜백 기능을 만났는데, 이번에는 적어서 공유하려고 합니다.

소위 콜백 함수, 객체지향 언어의 콜백 메소드는 쉽게 말하면 특정 시점(이벤트 발생)에 콜백되는 함수이다.

더 자세히 설명하면 함수 A가 매개변수로 다른 함수 B에 전달된 후 특정 시간에 B에 의해 호출됩니다.

여기서 질문이 있을 수 있습니다. 한 함수가 다른 함수를 호출하는데, 함수 본문에서 호출할 수 있는 함수를 다른 함수에 매개변수로 전달해야 하는 이유는 무엇인가요? 일부 언어(Java 등)는 매개변수로 함수를 지원하지 않습니다.

그렇습니다. 실제로는 함수 본문에서 다른 함수를 호출할 수 있습니다. 함수에는 별 차이가 없어 보이지만 여기에는 문제가 있습니다. 즉, 호출하려는 함수가 하드 코딩되어 있다는 것입니다. 이 함수 B는 함수 A만 호출할 수 있다는 뜻입니다. 따라서 다른 시나리오에서 A와 다른 함수 C가 있고 특정 순간에 B에서 호출해야 하는 경우는 어떻게 될까요?

콜백 함수에 대해 계속 이야기해 보겠습니다. C#에서는 함수 포인터를 매개 변수로 사용하여 다른 함수에서 콜백 함수를 호출할 수 있습니다. 메소드에는 이벤트 키가 있는데, 파이썬과 자바스크립트에서는 함수를 객체 매개변수로 직접 전달할 수 있는데, 이런 언어들은 콜백 함수(메소드)를 구현하기 쉽지만, 일단 자바는 어때요? C#, 저는 Java를 더 이상 좋아하지 않습니다. 한 번은 Java를 앞으로 다시 사용하지 않을 계획이었지만 현실은 그리 이상적이지 않습니다. 이제는 Android를 만들고 싶어서 지금도 Java를 놓을 수 없습니다. 이 콜백 함수의 문제점에 직면했는데, 저는 개인적으로 자바를 제외한 이 블로그에 나오는 언어들은 모두 콜백을 쉽고 이해하기 쉽게 구현할 수 있다고 생각합니다. Java의 경우가 그렇지 않았다면 저는 이 블로그를 작성하지 않았을 것입니다.

자, 계속해서 Java의 콜백 메소드 구현에 대해 이야기해 보겠습니다. 이 블로그의 초점은 Java입니다. Java에서는 인터페이스를 빌려서 콜백 메소드를 구현합니다. 인터넷에서 발견한 문장은 다음과 같습니다.

"특정 인터페이스를 구현하는 클래스에서 생성한 객체의 참조를 해당 인터페이스에서 선언한 인터페이스 변수에 할당합니다. , 그러면 인터페이스 변수가 구현된 인터페이스의 메서드를 호출할 수 있습니다."
매우 헷갈리는데 간단히 설명하자면
인터페이스가 있고, 인터페이스 안에 메소드가 있습니다(이 메소드가 콜백되는 메소드입니다):

interface CallBackInterface {
  void callBackMethod();
}

우리는 객체 내부의 메소드가 구현되지 않았기 때문에 객체 인터페이스를 직접 사용할 수 없다는 것을 알고 있습니다. 따라서 이 인터페이스를 구현하는 클래스를 찾으십시오.
이제 이 인터페이스를 구현하기 위한 클래스를 추가합니다.

interface CallBackInterface {
  void callBackMethod();
}
 
class CallBackClass implements CallBackInterface{
 
  @Override
  public void callBackMethod() {
    System.out.println("hello");
  }
}

자, 마지막 단계입니다. 인터페이스를 구현하는 클래스의 객체를 인터페이스 변수를 선언했습니다(메소드에 작성한 다음 외부에 클래스 쉘을 추가했습니다):

public class CallBackTest {
 
  interface CallBackInterface {
    void callBackMethod();
  }
 
  class CallBackClass implements CallBackInterface {
 
    @Override
    public void callBackMethod() {
      System.out.println("hello");
    }
  }
 
  public void showCallBack() {
    CallBackInterface itfs = new CallBackClass();
    itfs.callBackMethod();
  }
}

이제 호출하여 사용해 볼 수 있습니다.

public class Test {
  public static void main(String[] args) {
    new CallBackTest().showCallBack();
  }
}

만약 사고가 없다면 hello는 성공적으로 출력될 것입니다. 어쨌든 제 편입니다.

예제를 다 읽었는데 어떻게 했나요? 좀 더 자세히 설명하자면, 특정 메서드에서 호출되는 메서드가 있습니다(이 메서드는 콜백 메서드입니다). 앞서 말했듯이 콜백 메서드에서 수행하려는 작업을 직접 작성하지 않는 것이 가장 좋습니다. 호출 메소드, 그리고 java 메소드를 매개변수로 전달할 방법이 없기 때문에 콜백 메소드를 인터페이스에 넣어야 합니다. 추상 클래스와 인터페이스의 차이점을 알아보고 직접 해결해 보세요. 인터페이스가 있는 경우 클래스에 의해 구현되어야 합니다. 그런 다음 인터페이스의 개체에 구현 클래스의 개체가 할당되는 한 이 인터페이스의 개체는 해당 메서드를 호출할 수 있습니다. 이를 이해하기 위해 중요한 점 중 하나는 다형성입니다. 여기서 사용되는 다형성 지식은 인터페이스의 객체가 하위 클래스에 의해 성공적으로 할당될 수 있고 하위 클래스의 재정의된 메서드가 호출될 수 있다는 것입니다(클래스도 비슷한 개념을 가지고 있습니다).

한 가지 더 중요한 점은 여기에서 CallbackInterface 인터페이스를 구현하는 모든 클래스는 다음과 같이 new(즉, 할당) 뒤에 배치될 수 있다는 것입니다.

public class CallBackTest {
  interface CallBackInterface {
    void callBackMethod();
  }
 
  class CallBackClass implements CallBackInterface {
 
    @Override
    public void callBackMethod() {
      System.out.println("hello");
    }
  }
 
  class Controller {
    private CallBackInterface cbitf;
    // 这个boolean只是为了模拟有事件,没啥实用价值
    public boolean somethingHappend;
    // 这里确实可以直接把CallBackClass做参数,而且省掉接口的定义
    // 但是这样做的话,就像是回调函数直接写在了调用函数里一样
    // 不明白的话就好好理解下"约定"和"调用者不管回调函数是怎么实现的"吧
    public Controller(CallBackInterface itfs) {
      somethingHappend = true;
      this.cbitf = itfs;
    }
 
    public void doSomething() {
      if(somethingHappend) {
        cbitf.callBackMethod();
      }
    }
  }
 
  public void showCallBack() {
    CallBackClass cbc = new CallBackClass();
    Controller ctrlr = new Controller(cbc);
    ctrlr.doSomething();
    // 其实上面也可以这样写在一行里
    // new Controller(new CallBackClass()).doSomething();
  }
}

마지막으로 한 가지 더 말씀드리자면, 사실 이런 종류의 애플리케이션은 안드로이드를 배울 때 자주 접하게 됩니다.

위 내용은 콜백 함수에 대한 개인적인 이해와 사용법입니다.

자바 콜백 함수에 대한 더 많은 글은 PHP 중국어 홈페이지를 주목해주세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.