Menu
Coddy logo textTech

다중 인터페이스

Coddy Kotlin 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 24번째.

클래스는 쉼표로 구분하여 여러 인터페이스를 구현할 수 있습니다. 클래스는 모든 인터페이스의 멤버를 구현해야 합니다:

interface Switchable {
    var isOn: Boolean
    fun toggle() { isOn = !isOn }
}
interface Dimmable {
    var level: Int
}
class Lamp : Switchable, Dimmable {
    override var isOn = false
    override var level = 100
}

main 내부에서:

val lamp = Lamp()
lamp.toggle()
lamp.level = 40
println("${lamp.isOn} ${lamp.level}")

출력:

true 40

클래스는 동일한 헤더에서 하나의 클래스를 상속하고 인터페이스를 구현할 수 있습니다. 생성자 호출이 있는 것은 슈퍼클래스뿐입니다:

open class Device(val name: String)
interface Rechargeable {
    fun charge(): String
}
class Phone(name: String) : Device(name), Rechargeable {
    override fun charge() = "$name is charging"
}

main 내부:

println(Phone("Pixel").charge())

출력:

Pixel is charging

두 인터페이스가 모두 동일한 메서드에 기본 본문을 제공하면, 클래스는 이를 재정의하고 어떻게 처리할지 결정해야 합니다. super<Name>.method()는 특정 인터페이스 중 하나의 버전을 호출합니다:

interface Camera {
    fun describe() = "takes photos"
}
interface Telephone {
    fun describe() = "makes calls"
}
class SmartPhone : Camera, Telephone {
    override fun describe() = super<Telephone>.describe() + " and " + super<Camera>.describe()
}

main 내부에서:

println(SmartPhone().describe())

출력:

makes calls and takes photos

인터페이스는 다른 인터페이스를 확장할 수 있습니다. 결합된 인터페이스를 구현하는 클래스는 모든 인터페이스의 멤버를 제공해야 하며, 각 인터페이스로 간주됩니다.

interface Named {
    val name: String
}
interface Contact : Named {
    val email: String
    fun card() = "$name <$email>"
}
class Person(override val name: String, override val email: String) : Contact

main 내부에서:

val ada = Person("Ada", "ada@example.com")
val named: Named = ada
println(ada.card())
println(named.name)

출력:

Ada <ada@example.com>
Ada
challenge icon

챌린지

쉬움

두 인터페이스가 스마트 기기를 설명합니다. Switchable은 isOn(호출자가 읽기만 할 수 있는 Boolean)과 toggle()을 요구하고, Dimmable은 쓰기 가능한 brightness를 요구합니다. SmartLamp가 두 인터페이스를 모두 구현하도록 만드세요. 처음에는 꺼진 상태이고 밝기는 100이며, toggle()은 켜짐과 꺼짐을 전환하고, 0에서 100 범위를 벗어난 밝기는 setter가 해당 범위로 제한하며, status()는 on 70% 또는 off를 반환해야 합니다.

제공된 코드는 toggle 명령 또는 밝기 숫자를 읽어 하나의 램프에 적용하고 각 명령 후 status()를 출력한 다음, 램프가 Switchable 및 Dimmable인지 확인합니다.

코드는 Switchable.kt, Dimmable.kt, SmartLamp.kt에 작성하세요. Main.kt에는 제공된 입출력 코드가 들어 있으며 편집할 수 없습니다.

직접 해보기

fun main() {
    // 제공된 입력/출력 코드: 있는 그대로 유지하세요
    val input = generateSequence(::readLine).toList()
    val lamp = SmartLamp()
    for (cmd in input) {
        if (cmd == "toggle") lamp.toggle() else lamp.brightness = cmd.toInt()
        println(lamp.status())
    }
    println("switchable: ${(lamp as Any) is Switchable}, dimmable: ${(lamp as Any) is Dimmable}")
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: Kotlin 플레이그라운드