class Button


자 버튼 클래스가 있어


그리고 이 버튼 객체를 메인 클래스가 가지고 있다 치자



class Main

{

 Button button

}


우리가 하고 싶은 것은?


메인에 있는 이 버튼이 눌린 그 순간, 메인에서 뭔가 처리를 시켜주고 싶어!

이거야


이럴 때 쓰는 게 바로 리스너야


그래서 버튼이 눌리면 버튼이 눌렸다는 콜백함수를 받는 거지

콜백함수가 말이 어려우면 이벤트라고 생각해


왜 굳이 이렇게 하냐?

디커플링을 위해서야


버튼은 온전히 버튼의 역할만 하는 거지

메인의 기능까지 넣을 필요는 없자나?


만약에 버튼이 말이야

메인에만 있는게 아니고 여러군데 있으면


그 기능을 전부다 버튼 쪽에 구현해야되거든

그럴 수는 없잖아


그래서 버튼에다가 버튼 전용 인터페이스(리스너)를 등록하는 일을 하는 거야


button.addListener(this)


헐 근데 this를 하면 main 클래스 자체가 들어가겠지?

이렇게 구현 해버리면 커플링되잖아?

왜냐 메인은 그냥 메인 클래스지, 리스너가 아니야


그래서 필요한거시 인터페이스 상속이다



// 메인이 버튼리스너를 상속받음

class Main implements ButtonListener

{

}


interface ButtonListener

{

void onClick();

}


자 말 그대로의 버튼을 청취할 수 있는 인터페이스 기능을 main이 가지게 된 거야

버튼이 눌리게 되면 저 onClick 함수가 호출되는 거지!


이러면


button.addListener(this)


이렇게 메인 클래스를 인터페이스로서 넘기는 게 가능해짐

이제 버튼 쪽에서 저 인터페이스 함수를 호출하면?


class main : ButtonListner

{

// 인터페이스로 구현된 함수

public void onClick()

{

}

}


main 쪽에 있는 이 onClick 함수가 호출되는 것임 ㅇㅇ

이런걸 이벤트 기반 프로그래밍이라고 함니다