옵저버란 Observer (옵저버) 는 '관측자' 혹은 '감시자' 라는 뜻이다. 말 그대로 프로그래밍에서 Observer 패턴이라고 한다면 어떤 '이벤트' 가 일어나는 것을 감시하는 패턴을 의미한다.
예로 들어 설명하자면 아래와 같은 것들이 이벤트가 발생한 순간이라고 할 수 있다.
사용자가 키보드를 눌렀을 때
사용자가 어떤 버튼을 터치했을 때
호출한 API의 응답 데이터가 수신됐을 때
이러한 이벤트들을 감시하여, 이벤트가 발생할 때마다 미리 정의해둔 어떠한 동작을 즉각 수행하게 해주는 프로그래밍 패턴을 옵저버 패턴이라고 한다.
ex) A 라는 버튼이 클릭될 때마다 화면에 '안녕'을 출력하는 동작 등
(출처: https://velog.io/@haero_kim/%EC%98%B5%EC%A0%80%EB%B2%84-%ED%8C%A8%ED%84%B4-%EA%B0%9C%EB%85%90-%EB%96%A0%EB%A8%B9%EC%97%AC%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4)
위 예시에서는 A 클래스가 중간에 종을 만들어, B가 이벤트가 발생할 때마다 A 가 만들어둔 종을 울리도록 한다. A 는 종이 울릴 때마다 이를 알아차리고 이벤트가 감지됐을 때 수행할 동작을 자연스럽게 하는 플로우가 나온다.
즉, 둘 사이에 인터페이스를 하나 끼워넣는 방식이다. A 는 인터페이스를 상속하여 이벤트가 발생할 때마다 실행되게 할 메소드를 구현해둔다. 그리고 B 를 생성할 때 인터페이스 구현체를 전달하여, 이벤트가 발생할 때마다 생성자로 전달받은 A가 구현한 인터페이스 메소드를 호출하면 된다.
이때, 이 인터페이스를 Observer (옵저버)라고 부른다. 그리고 B 가 구현된 인터페이스 메소드를 호출함으로써 이벤트를 전달하는 행위를 Callback(콜백) 이라고 한다.
옵저버 패턴을 활용하면 다른 객체의 상태 변화를 별도의 함수 호출 없이 즉각적으로 알 수 있기 때문에, 이벤트에 대한 처리를 자주 해야 하는 프로그램이라면 매우 효율적인 프로그램을 작성할 수 있다. 또한 옵저버 패턴은 다른 객체의 상태 변화를 감지함에 있어 객체끼리 느슨하게 결합되는 형태이기 때문에, 의존성을 제거하고 시스템을 보다 유연하게 해주는 효과가 있다.
너무 많이 사용하게 되면 상태 관리가 힘들 수 있고 데이터 배분에 문제가 생기면 자칫 큰 문제로 이어질 수 있다.