์๊ณ ๋ฆฌ์ฆ ๊ตฐ(familiy)์ ์ ์ํ๊ณ ๊ฐ๊ฐ์ ์บก์ํ(encapsulate)ํ์ฌ ๊ตํํด์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค. ํด๋ผ์ด์ธํธ์ ์ฝ๋๋ ๋ณ๊ฒฝํ ํ์์์ด ์๊ณ ๋ฆฌ์ฆ์ ๋ณ๊ฒฝํ ์ ์๋ค.
์ปดํจํฐ ๋ณธ์ฒด ํน์ ๋ ธํธ๋ถ์ ๋ชจ๋ํฐ๋ฅผ ์ฐ๊ฒฐํด์ ์ฌ์ฉํ๊ณ ์ถ๋ค. ๋ณดํต ๋ณธ์ฒด์ ์์ ์ ๋ ฅ ๋จ์(vga, dvi, hdmi, c type ๋ฉํฐํฌํธ, usb 3.0 ๋ฑ์ ํฌ๋งท)์์ ๋ชจ๋ํฐ ์ถ๋ ฅ ๋จ์(์ญ์ vga, dvi, hdmi, dp ๋ฑ์ ํ์)๋ก ์ฐ๊ฒฐํ๊ฒ ๋๋ค.
์ ํํ ์ ์๋ ์ฌ๋ฌ ์ข ๋ฅ์ ์ปจ๋ฒํฐ๊ฐ ์๋ค.
- HDMI to HDMI
- HDMI to VGA
- USB 3.0 type to HDMI
- c type to HDMI
์ปจ๋ฒํฐ๋ฅผ ์ด์นญํ๋ ์ถ์ ํด๋์ค๋ฅผ ๊ตฌํํ๋ค.
abstract class Converter {
abstract fun input()
abstract fun output()
}case by case๋ก Converter class๋ฅผ implements ํ์ฌ ์์ํ๋ฉด ์ฝ๋ ์ค๋ณต์ ์ผ๊ธฐํ ์ ์๋ค. Converver class์ ๊ตฌํ์ฒด์ธ HDMIToHDMIConverter์ CTypeToHDMIConverter๋ ๊ฐ์ ๊ณ์ธต(hirarchy)์ ์์นํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋ ์ค๋ณต์ ์ค์ธ๋ต์๊ณ ๊ฐ์ ๊ณ์ธต์ ํด๋์ค๋ฅผ ์์ํ๋ฉด UML ๊ด๊ณ๋๊ฐ ๋์กํด ์ง ๊ฒ์ด๋ค.
class HDMIToHDMIConverter : Converter {
override fun input(){
println("HDMI ์ธํ ์ ํธ ์๊ณ ๋ฆฌ์ฆ")
}
override fun output(){
println("HDMI ์์ํ ์ ํธ ์๊ณ ๋ฆฌ์ฆ")
}
}
class CTypeToHDMIConverter : Converter {
override fun input(){
println("C Type ์ธํ ์ ํธ ์๊ณ ๋ฆฌ์ฆ")
}
override fun output(){
println("HDMI ์์ํ ์ ํธ ์๊ณ ๋ฆฌ์ฆ")
}
}๋จผ์ ๋ณ๊ฒฝ๋ ์์ง๊ฐ ์๋ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํด๋ณด์. ์ผ๋จ input, output์ ๊ธฐ๋ฅ์ ๊ณตํต์ ์ผ๋ก ๊ฐ๊ณ ์๋ค. ๊ทธ๋ฌ๋ input, output์ ๋ด๋ถ ๊ตฌํ์ ๋ฌ๋ผ์ง ์ ์๋ค. input๊ณผ output ๋ฉ์๋๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ธํฐํ์ด์คํ ํ๋ค.
interface IInput {
fun input()
}
interface IOutput {
fun output()
}๋ฌผ๋ก ๊ณตํต Interface๋ก ๋ฌถ์ด์ ํ๋ฒ์ Input, Output์ ํต์นญํ๋ ์ฝ๋๋ฅผ ์์ฑํ ์๋ ์๊ฒ ์ผ๋ ์ดํด๋ฅผ ์ฝ๊ฒ ํ๊ธฐ ์ํด IInput, IOutput์ผ๋ก ์ธํฐํ์ด์ค๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ผ๋ก ํ๊ฒ ๋ค. (์ฝํ๋ฆฐ์ด๋ ์๋ฐ 8 ์ด์์์๋ Lambda๋ก ๊ตฌํํด๋ ๋๋ค.)
interface ISignal {
// input, output ์์
์ ํต์นญ
fun invoke()
}IInput์ ์์ํ ๊ตฌํ์ฒด๋ค์ **์๊ณ ๋ฆฌ์ฆ ๊ตฐ(family)**์ ์ด๋ฃจ๊ฒ ๋๋ค.
class HDMIInput : IInput {
override fun input(){
println("HDMI ์ธํ ์ ํธ ์๊ณ ๋ฆฌ์ฆ")
}
}
class CTypeInput : IInput {
override fun input(){
println("C type ์ธํ ์ ํธ ์๊ณ ๋ฆฌ์ฆ")
}
}
class USB3.0Input : IInput {
override fun input(){
println("USB 3.0 ์ธํ ์ ํธ ์๊ณ ๋ฆฌ์ฆ")
}
}
class VGAInput : IInput {
override fun input(){
println("VGA ์ธํ ์ ํธ ์๊ณ ๋ฆฌ์ฆ")
}
}IOutput์ ์์ํ ๊ตฌํ์ฒด๋ค๋ ์ญ์ **์๊ณ ๋ฆฌ์ฆ ๊ตฐ(family)**์ ์ด๋ฃจ๊ฒ ๋๋ค.
์ฝ๋๋ ๋น์ทํ ๊ฒ์ด๋ฏ๋ก ์๋ตํ๊ธฐ๋ก ํ๊ฒ ๋ค.
์ด๋ ๊ฒ ๋ด๋ถ ๊ตฌํ์ด ์ํฉ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ๋ถ๋ถ๋ง ์ถ๋ ค์ ์ธํฐํ์ด์คํ ์ํค๋ฉด, Converter ์ถ์ ํด๋์ค ์ ์ฒด๋ฅผ ์์๋ฐ์ง ์์๋ ๋๋ค. (composition over inheritance ๋ผ๊ณ ํ๋ค.) ์ฆ ์๋จ์ ๋ง๋ค์ด ๋์๋ HDMIToHDMIConverter ํด๋์ค์ CTypeToHDMIConverter ํด๋์ค๋ ๋ ์ด์ ํ์์๊ฒ ๋๋ค.
๊ธฐ์กด abstract class ์๋ Converterํด๋์ค์ abstract ์ง์์ด๋ฅผ ์ญ์ ํ ํ, ์์ฑ์์ IInput, IOutput ์ธํฐํ์ด์ค ๊ตฌํ์ฒด๋ฅผ DI(Dependency Injection) ํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ๋ค์ ์์ฑํด๋ณด์.
class Converter(private val iInput: IInput, private val iOutput: IOutput) {
fun input(){
// ์บก์ํ --> ๋ฌด์จ IInput ๊ตฌํ์ฒด๊ฐ ๋ค์ด์ฌ ์ง ์ ์ ์๋ค.
iInput.input()
}
fun output(){
// ์บก์ํ --> ๋ฌด์จ IOutput ๊ตฌํ์ฒด๊ฐ ๋ค์ด์ฌ ์ง ์ ์ ์๋ค.
iOutput.output()
}
}- Client ์ฝ๋์ "๋ด๋ถ ๊ตฌํ์ด ๋ฌ๋ผ์ง๋ ์๊ณ ๋ฆฌ์ฆ"์ ์บก์ํ๋์ด ํฅํ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์ด๋ ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ค.
- ์ ๋ต ํจํด์์๋ Composition(์กฐํฉ)์ด Inheritance(์์)๋ณด๋ค ์ ๋ฆฌํ๋ค. (์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฌ์ฉ ์ธก๋ฉด, SOLID OCP - ๊ฐ๋ฐฉ ํ์ ์์น์ ๋ถํฉ)