옵저버 패턴

하승진·2024년 7월 28일
0
post-thumbnail

옵저버

: 이벤트가 일어나는 것을 감시하는 감시자의 역할

옵저버 패턴

: 이벤트가 발생할 때마다 즉각적으로 처리할 수 있도록 만드는 프로그래밍 패턴

이벤트

: 안드로이드의 경우 키의 입력, 터치 발생, 데이터 수신 등 함수로 직접 요청하지 않았지만 시스템 또는 루틴에 의해서 발생하는 것

구성 클래스 요소

  • 이벤트를 수신하는 클래스
  • 이벤트의 발생 및 전달하는 클래스
  • 인터페이스

원리는 발생 및 전달하는 클래스에서 이벤트를 발생할 때 수신하는 클래스에 있는 이벤트를 처리하는 함수를 호출하여 알려준다.

하지만 이벤트를 수신하는 클래스의 필요에 따라 이벤트를 발생하는 클래스에 인스턴스를 생성하여 사용하기 때문에 수신 클래스는 발생하는 클래스를 직접 참조하여 사용할 수 있지만 반대로 참조하여 접근은 불가능하다.

그래서 이를 해결하기 위해 둘 사이에 인터페이스를 생성하여 연결한다.
그렇게 되면 필요에 따라 수신 클래스로 인해 발생 클래스에 생성된 인스턴스는 이벤트를 받을 수 있는 인터페이스를 만들어 공개하고, 수신 클래스에서는 이를 구현하여 넘겨주면 이벤트를 넘겨질 수 있게 된다.

이때 이 인터페이스를 observer 또는 리스너라고 부르고, 이벤트를 넘겨주는 행위를 callback이라고 부른다.


먼저 이벤트 발생시킬 함수를 추상함수 형태로 인터페이스에 정의한다.

그러곤 EventPrinter라는 수신하는 클래스가 start() 호출하게 되면 이벤트 발생시키는 클래스인 Counter 클래스의 인스턴스 객체를 생성하게 되는데, 파라미터로 this를 넣어 EventListener의 구현부를 넘겨준다.

이 this를 왜 쓴것인지 더 정확하게 말하면 EventPrinter는 EventListener 인터페이스를 상속 받아 해당 함수를 재정의하고 있다. 자기 자신의 클래스에서 정의한 함수를 Counter 클래스에서 이벤트 발생할 때 자신이 정의한 onEvent가 호출하기 위해서 this를 사용하는 것이다.


그런데 여기서 EventPrinter가 EventListener를 상속받아 구현하지 않고, 임시로 만든 별도의 EventListener 객체를 대신 넘겨줄 수도 있다.
=> 이러한 임시로 만든 객체를 '이름이 없는 객체'라 하여 익명 객체라 한다.

파라미터에 object 키워드 명시 후 이름을 달지 않아 익명 객체를 생성 후 EventListener를 상속 받아 onEvent함수를 재정의 하면 된다.

코드 길이가 확실히 줄어드는 것을 알 수 있고, 인터페이스를 구현한 객체를 코드 중간에도 즉시 생성하여 사용 가능하다.

profile
기어갈지언정 한 발자국씩이라도 가보자

0개의 댓글