
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()
}
'Android-Kotlin📱' 카테고리의 다른 글
[Android] 안드로이드 4대 컴포넌트 (Activity, Service, BroadCast Receiver, Content Provider) (0) | 2022.06.19 |
---|---|
[Android] Constraint Layout Guideline (컨스트레인트 레이아웃 가이드라인) (0) | 2022.06.07 |
[Kotlin] 날씨 앱 만들기 - Retrofit, RecyclerView (0) | 2022.05.25 |
[Android/Kotlin] Naver Geocoding 주소로 위도 경도 추출 코틀린 json 데이터 파싱 (0) | 2022.05.24 |
[Android/Kotlin] 실시간 위치 구현하기 with Naver map SDK (0) | 2022.05.23 |