[Observer 패턴] 어떤 클래스 안에서 일어나는 이벤트를 알려고자한다면.

2008. 12. 10. 09:16Java

Observer 패턴

갑자기. ncanis.tistory.com 도메인으로 들어가질 않는군요. ㅡ.ㅡ;
오늘 아침에야 겨우 되네요. 에효. ㅠ.ㅠ

================================================================


오늘도 열씸히 코딩 뚝딱거리는 ncanis 입니다.~ ㅋㅋ
왤케, 요즘 떠돌아 다니는 각종 블로그에 있는 패턴 설명들 왜이리 어려울까요.~
개발자인 저도 잘 이해가 안되는 경우가 많더군요.
하물며, 개발 초보자는 알아듣지도 못하겠더군요. :( ,
사실 제글도 그러한지 걱정됩니다.~ ㅋㅋ

그래서 써볼려고 합니다. 패턴에 대해서, (나름대로요. ^^)



각설하고, 솔직히 저는 패턴에 평소에 그다지 신경쓰지 않지요. 그러나 열씸히 코딩을 하다보면
패턴처럼 만들어 지기도 합니다.

즉, 필요한곳에 좋은 설계를 집어넣으려고 하다보면 패턴이 되는 거죠.~

무작정 패턴책을 사서 읽히는것. 정말 반대합니다. 그래서는 제대로 공부할 수도 없죠.
머머 패턴의 의미는 알지만 실제 적용을 하라고 하면 못합니다. 이게 문제죠.~

실제로. 어디에 쓰면 좋은건지 부터 알아야합니다.
(사실, 자기가 만들고 있는 프로젝트에서 패턴이 쓰인 곳을 보고 배운다면,그게 최고죠. ^^)

오늘은 Observer패턴에 대해서 얘기해 보려고 합니다.
말그대로 옵저버죠. 스타에서 숨은 케릭터를 보는기능.~ 캬.

프로그래밍으로 말하자면,

어떤 객체안에서 데이터 변화가 일어날때 이를 알려주는것을 옵저버라고 표현하면 딱이지요.

말은 이렇지만 생각은 간단하죠.

예를 들어 UserManager 라는 클래스가 있다고 합시다.
이 클래스는 유저를 등록하고, 삭제하는 기능이 있습니다. 즉 아래와 같죠.

UserManager {
     public void add();
     public void remove();
}

근데 나는 이렇게 유저가 추가 되고 삭제될때 마다 CallMe라는 클래스에게 알려주고 싶습니다.
어떻게 할까요.

UserManager {
    public void add() {
          CallMe.call("유저추가됨");
    }
    public void remove() {
          CallMe.call("유저삭제됨");
    }
}


위와 같이 됩니다. 간단하죠. ㅡ.ㅡ; 그냥 메소드안에서 다른 클래스의 메소드를 호출만 해주면 됩니다.
패턴 별거 아니죠. 근데 이렇게 함으로써 얻는 이익은 무엇이 있을까요.
그냥 add 메소드에 call 메소드의 기능을 합치면 되지 않나? 라고
생각할수도 있습니다.

하지만, 위와 같이 함으로써, 얻는 이익이 있죠.
안에 들은것이 무엇인지는 모르지만, 유저가 추가되거나 삭제될때,
내가 구현한. (중요)  내가 등록한 무엇을 통해 전달 된다는 거죠.

예를 들어, Swing에 Button을 등록하고, 이벤트에 리스너를 등록하죠.
우리가 마우스를 클릭하면, 우리가 구현한 리스너의 clicked함수에 이벤트가 전달되어 옵니다.
이게 바로 옵저버가 써야할 곳이죠. ^^

방식은 위와 같고, 좀더 깔끔하게 작성해 보면 아래와 같죠.~

========================================================================
public interface Observer{
      public void call(String msg);
}

public class CallMe implements Observer{
      public void call(String msg) {
              System.out.println("received="+msg);
      }
}
public class UserManager{
    Observer o;
    public void addEventListener(Observer o) {
          this.o = o;
    }
    public void add() {
         o.call("유저추가됨");
   }
   public void remove() {
         o.call("유저삭제됨 ");
   }
}


이제 옵저버를 등록을 어떻게 하면 될까요.~
Observer o = new CallMe();
UserManager um = new UserManager();
um.addEventListener(o);   <=========요부분 이겄죠? ^^

이제 UserManager에 유저가 추가되거나 삭제될때 이를 CallMe에 전달하는게 되겠죠~?
즉, UserManager에서 일어나는 일을 알고싶은 사람은 누구나 Observer인터페이스를 구현해서
등록하면 데이터를 전달받게 됩니다. ^^

=======================================================================

무슨일이 있을때 패턴부터 생각하지말고, 항상 어떻게 하면 좋을까 부터 생각 하는게 중요합니다.
패턴 공식을 아무리 많이 알아도 실제 어떻게 쓰여지는지 알지 못하면 그림의 떡입니다.

갑자기 패턴 생각이 나 이렇게 글을 또 적었네요. ㅎㅎ


이해하기 편하신가요?

by ncanis