말을 그럴듯하게 붙여서 그렇지 별게 아닙니다.
C++의 경우 함수 포인트나 메소드 포인트가 있기 때문에
인터페이스를 동원하지 않아도 콜백을 쉽게 구현할수 있습니다.
델파이 역시 쉽게 구현되고
C# 역시 delegate로 쉽게 구현됩니다.
그런데 java는 콜백을 위한 지원이 없습니다.
유일하게 할수 있는 방법이 바로 인터페이스를 통한 콜백입니다.
그런데 이게 약간 불편한데 어떨때는 이게 유용하기도 합니다.
아래는 인터페이스를 통한 자바스타일의 콜백 구현 간단 예제입니다.
(물론 자바가 있기 전부터 C++에서는 이게 가능했으므로 꼭 자바스타일이라고 할거까지 없지만)
//---------------------------------------------------------------------------
// 콜백용 인터페이스 선언
interface IAdd
{
virtual int add(int x, int y) = 0;
};
// 콜백용 인터페이스를 클래스로 구현
class CAdd : public IAdd
{
int add(int x, int y)
{
return (x + y) * 2;
}
};
// 콜백 테스트 함수. 메소드에서 해도 마찬가지입니다.
int GetAdd(IAdd& addclass, int x, int y)
{
return addclass.add(x, y);
}
// 테스트
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
CAdd addclass;
Caption = GetAdd(addclass, 1, 2);
}
//---------------------------------------------------------------------------
약간 코드가 눈에 잘 안들어 온다면 이렇게 해 볼까요.
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
class CAdd : public IAdd
{
int add(int x, int y)
{
return (x + y) * 3;
}
};
CAdd add;
Caption = GetAdd(add, 1, 2);
}
//---------------------------------------------------------------------------
아주 쉽죠.
한가지 눈여겨 볼만한 부분은 구현 클래스에
public 이라는 영역 지정자가 없는데도 불구하고
(클래스에서 public 지정이 없으면 기본 private이 적용 되죠)
호출하는데 젼혀 문제가 없죠.
왜 그런지는 한번 생각해 보시기를..
|