https://kotlinlang.org/docs/delegation.html

 

 

Delegation pattern, 델리게이션 패턴은 디자인 패턴 중 하나입니다.

 

 

 

디자인 패턴이란?

개발에 있어서 발생하는 일반적인 문제(반복 코드 제거, 수정 용이 등등..)에 대해
솔루션을 구상하기 시작했으며, 개발 설계의 도움이 되는 솔루션의 집약체

 

 

이 디자인 패턴은 객체지향 프로그래밍에 특징 중 하나인 코드의 재사용을 향상 시키기 위한 패턴이며

델리게이션 패턴은 Kotlin 뿐만 아니라, iOS에 개발언어인 Swift에도 존재합니다.

 

 

코드의 재사용을 향상 시키는 것은 상속도 있는데 왜 쓰나요?
→ 상속은 SuperClass, SubClass로 구성되고, 강한결합으로 이루워져 있기 때문에

Super Class의 변화가 일어난다면 Sub Class에도 영향을 끼치게 되며, 유연성을 떨어트릴 가능성이 있습니다.

 

 

델리게이션 패턴 사용 X

 

// 인터페이스 다운로더이며 내부에 있는 함수는 다운로드, 함수는 상속 후 재정의
interface Downloader {
    fun download()
}

// 클래스 내부에서 인터페이스를 상속 및 정의
class MediaFile(val downloader: Downloader): Downloader {
 
    // 인터페이스 내부 함수 재정의
    override fun download() {
        downloader.download()
    }
    
}

class FileDownloader(val file: String):Downloader {
    override fun download() {
        println("$file Downloaded")
    }
}

fun main() {
    val file: String = "File1.mp4" 
    val mediaFile = MediaFile(FileDownloader(file)) 
    mediaFile.download() 
}

 

 

델리게이션 패턴 사용 O

클래스 내부 프로퍼티에 적용

 

//인터페이스 다운로더이며 내부에 있는 함수는 다운로드, 함수는 상속 후 재정의
interface Downloader {
    fun download()
}

// 클래스 내부에서 인터페이스를 상속 및 정의 	
class MediaFile (val downloader: Downloader): Downloader by downloader

class FileDownloader(val file: String): Downloader {
    override fun download() {
	println("$file Downloaded")
       }
}

fun main() {
    val file: String = "File1.mp4"
    val mediaFile = MediaFile(FileDownloader(file))
    mediaFile.download()
}

 

by 키워드를 씀으로써 클래스 내부에서 직접 함수를 일일히 변경하지 않아도 코드를 감소 시킬 수 있습니다.

본인이 구현한 overide fun을 위임함으로써 다른 class에서도 함수를 사용케함

 

interface Contect {
    fun say()
}

class me(): Contect {
    override fun say() { println("매칭되었습니다.") }
}

class other(): Contect by me()

fun main() {
    other().say()
}
복사했습니다!