이 포스트는 아래의 Android 공식 홈페이지에서 제공하는 Codelab을 기반으로 작성되었습니다.
https://developer.android.com/codelabs/basic-android-kotlin-compose-generics?hl=ko#0
이전 포스트에서는 코드를 직접 추가하지 않고 확장 속성 및 확장 함수를 사용하여 클래스에 속성 및 메소드를 추가하는 방법을 알아봤다.
하지만 클래스 확장이 항상 필요하지는 않으며 특정 메소드나 속성이 존재해야 한다는 점을 제외하고 어떤 구현이 필요한 지 모르는 경우도 있다.
동일한 추가 속성과 메소드를 갖는 여러 클래스(동작은 다를 수 있음)가 필요한 경우 인터페이스를 사용하여 그러한 속성과 메소드를 정의할 수 있다.
인터페이스는 중괄호 내에 인터페이스를 준수하는 모든 클래스가 구현해야 하는 메소드 or get-only 속성을 정의할 수 있다.
인터페이스(interface)는 일종의 계약이다. 인터페이스를 준수하는 클래스를 인터페이스를 확장한다고 말한다.
클래스는 콜론(:)과 공백, 인터페이스 이름을 차례로 사용하여 인터페이스를 확장하려고 함을 선언할 수 있다.
클래스가 인터페이스를 확장하면 인터페이스에서 지정된 모든 속성과 메소드를 구현해야 한다.
따라서 인터페이스가 수정되는 경우 인터페이스를 확장하는 모든 클래스를 업데이트해야 한다.
interface ProgressPrintable {
val progressText: String
fun printProgressBar()
}
class Quiz : ProgressPrintable {
override val progressText: String
get() = "${answered} of ${total} answered"
override fun printProgressBar() {
repeat(Quiz.answered) { print("▓") }
repeat(Quiz.total - Quiz.answered) { print("▒") }
println()
println(progressText)
}
companion object StudentProgress {
var total: Int = 10
var answered: Int = 3
}
}
fun main() {
Quiz().printProgressBar()
}
▓▓▓▒▒▒▒▒▒▒
3 of 10 answered