diff --git a/_21proxy/Printable.kt b/_21proxy/Printable.kt new file mode 100644 index 0000000..af8c596 --- /dev/null +++ b/_21proxy/Printable.kt @@ -0,0 +1,6 @@ +package _21proxy + +interface Printable { + var name: String? + fun print(string: String) +} diff --git a/_21proxy/Printer.kt b/_21proxy/Printer.kt new file mode 100644 index 0000000..8a36332 --- /dev/null +++ b/_21proxy/Printer.kt @@ -0,0 +1,20 @@ +package _21proxy + +class Printer(override var name: String?) : Printable { + init { + heavyJob("Printer 인스턴스 생성 중 name = $name") + } + + override fun print(string: String) { + println("===$name===") + println(string) + } + + private fun heavyJob(message: String) { + println(message) + repeat(5) { + Thread.sleep(1000) + println(".") + } + } +} diff --git a/_21proxy/PrinterProxy.kt b/_21proxy/PrinterProxy.kt new file mode 100644 index 0000000..d48e833 --- /dev/null +++ b/_21proxy/PrinterProxy.kt @@ -0,0 +1,26 @@ +package _21proxy + +class PrinterProxy(initialName: String?) : Printable { + private var real: Printer? = null + + override var name: String? = initialName + @Synchronized + set(value) { + field = value + if (real != null) { + real?.name = value + } + } + + override fun print(string: String) { + realize() + real?.print(string) + } + + @Synchronized + private fun realize() { + if (real == null) { + real = Printer(name) + } + } +} diff --git a/_21proxy/main.kt b/_21proxy/main.kt new file mode 100644 index 0000000..4b2e220 --- /dev/null +++ b/_21proxy/main.kt @@ -0,0 +1,9 @@ +package _21proxy + +fun main() { + val p = PrinterProxy("Alice") + println("이름은 현재 ${p.name} 입니다.") + p.name = "Bob" + println("이름은 현재 ${p.name} 입니다.") + p.print("Hello World!") +}