컴퓨터 언어/코틀린

[Kotlin] 코틀린 옵저버 패턴 리스너

훈츠 2020. 2. 15. 17:17
반응형

안녕하세요. 훈츠 입니다. 오늘은 코틀린에서 광범위하게 사용되는 옵저버 패턴을 구현 하는 방법에 대해 설명 드리겠습니다. 옵저버 패턴을 구현하는 방법은 두가지 입니다. 한가지는 인터페이스를 상속하는 방법과, 두번째는 익명 함수를 통해서 익명 클래스를 구현하는 방법입니다. 

 

옵저버 패턴 

키의 입력, 터치의 발생 같은 시스템 또는 루틴에 의해 발생되는 동작들을 이벤트라고 부릅니다. 이벤트가 발생 했을때 상호 작용 할수있는 패턴을 옵저버 패턴이라고 합니다. 코틀린에서는 리스너라고 부르기도 합니다. 

 

옵저버 패턴을 구현하는 방법 [class A - <interface C> - class B ]

  • 인터페이스 구현 
  • 두개의 클래스 class A, class B
    • class A : 인터페이스를 속성값으로 받는 펑션 클래스 
    • class B : 인터페이스를 상속후 함수 오버라이딩 클래스
  • 옵저버란? 이벤트가 일어나는것을 감시 하는 감시자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//Hoons Blog---https://rain2002kr.tistory.com------------------------------------------------------------------코드///
//인터페이스 EventListener 
interface EventListener{
    fun onEventLoadData(count:Int)
}
 
//한개의 펑션클래스 : 콜 할때마다 1부터 5까지 더해지는 기능 구현, 
//EventListener를 속성값으로 받고 호출
class FunctionClass(var load : EventListener){
    companion object {
        var count =0
 
    }
 
    fun countup(){
        for(i in 1..5){
            load.onEventLoadData(count ++)
        }
    }
}
 
//인터페이스 EventListener를 상속하는 프린터 클래스
class PrinterClass() : EventListener{
    override fun onEventLoadData(count: Int) {
            println("${count}")
        }
    fun start(){
        val data = FunctionClass(this)
        data.countup()
    }
}
//main
fun main() {
    var print = PrinterClass()
    print.start()
}
//출력화면 
0
1
2
3
4
cs

 

익명 함수

이벤트 리스너를 상속받아 구현하지 않고, 임시로 만든 별도의 이벤트 리스너 객체를 대신 넘겨 주는 방법입니다. 이것은 이름이 없는객체라 하여 익명 객체라고 합니다. 이렇게 하면 인터페이스로 구현한 객체를 코드 중간에도 '즉시 생성' 하여 사용 할수 있습니다. 이 패턴을 이해 하시는게 중요 합니다. 

익명 함수를 이용하여 옵저버 패턴을 구현하는 방법 [class A[내부 function안에 object이용] - <interface C> ]

  • 인터페이스 구현 

  • 한개의 클래스 class A, class B
    • class A : 인터페이스를 속성값으로 받는 펑션 클래스
    • class B : 클래스 내부에 Function 에 익명 객체 받아 구현
      • var, val example = Example(object : EventListener {...

이와 같이 익명 함수를 이용하면, 클래스 혹은 코드 어디서도 손쉽게 익명 객체를 만들어서 사용할수 있습니다. 무엇보다 구조를 이해하고 사용하는게 중요 합니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//Hoons Blog---https://rain2002kr.tistory.com------------------------------------------------------------------코드///
//인터페이스
interface EventListener{
    fun onEventLoadData(count:Int)
}
//한개의 펑션클래스 : 콜 할때마다 1부터 5까지 더해지는 기능 구현, EventListener를 속성값으로 받고 호출
class FunctionClass(var load : EventListener){
    companion object {
        var count =0
    }
 
    fun countup(){
        for(i in 1..5){
            load.onEventLoadData(count ++)
        }
    }
}
//프린터 및 시작부
class PrinterClass2() {
  fun start(){
      val count =FunctionClass(object :EventListener{
          override fun onEventLoadData(count: Int) {
              println("${count}")
          }
      })
      count.countup()
  }
}
fun main() {
    var print2 = PrinterClass2()
    print2.start()
}
//출력화면
5
6
7
8
9
cs

 

 

반응형