[Kotlin/코틀린] 인터페이스와 다중 상속이란?

반응형
SMALL

코틀린에서는 다중 상속이 불가능하다. 하지만, 인터페이스를 통해 이와 비슷하게 구현 가능하다. 예를 들어, 게임 캐릭터를 개발할 때, 하나의 캐릭터가 여러 가지 직업 특성을 가지도록 하게 만든다면 아래와 같이 구현할 수 있다.

 

인터페이스 정의하기

각 지업을 인터페이스로 정의하여, 필요한 특성을 메서드로 구현할 수 있다.

interface Archer {
    fun shootArrow() {
        println("궁수가 화살을 쏩니다!")
    }
}
interface Singer {
    fun sing() {
        println("가수가 노래를 부릅니다!")
    }
}
interface Warrior {
    fun attack() {
        println("전사가 공격합니다!")
    }
}
interface Thief {
    fun steal() {
        println("도적이 물건을 훔칩니다!")
    }
}

 

각 인터페이스는 캐릭터가 가지고 있을 수 있는 개별적인 직업 특성을 정의한다. 기본 구현 메서드를 포함해두면, 이를 상속받는 클래스에서 따로 구현하지 않아도 된다.

 

엥 왜 인터페이스는 open 키워드를 사용하지 않지??

  • 인터페이스의 기본 특성
    • 인터페이스는 다중 상속을 지원하며, 이를 구현하는 클래스는 자유롭게 메서드를 오버라이딩할 수 있다.
    • 따라서 인터페이스에 포함된 메서드는 기본적으로 open으로 간주
  • open 키워드가 필요한 경우
    • open 키워드는 클래스 또는 클래스의 메서드를 상속 및 오버라이딩 가능하도록 만들 때 사용한다.
    • 인터페이스는 이미 오버라이딩을 전제로 하기 때문에 별도의 open 키워드가 필요없다.

 

다중 직업을 가진 캐릭터 클래스 만들기

// 여러 직업을 가진 캐릭터 클래스 정의
class Character : Archer, Singer, Warrior, Thief {
    // 필요에 따라 특정 인터페이스 메서드를 오버라이딩할 수 있습니다.
    override fun shootArrow() {
        super.shootArrow()
        println("화살을 더욱 정확히 맞춥니다!")
    }

    override fun sing() {
        super.sing()
        println("청중이 감동받습니다!")
    }

    override fun attack() {
        super.attack()
        println("강력한 일격을 날립니다!")
    }

    override fun steal() {
        super.steal()
        println("아무도 눈치채지 못합니다!")
    }
}

 

Character 클래스는 Archer, Singer, Warrior, Thief 인터페이스를 모두 구현한다. shortArrow, sing, attack, steal 메서드를 각각 오버라이딩하여 기본 동작을 확장하거나 수정할 수 있다.

 

super 키워드를 통해 각 인터페이스의 기본 메서드를 호출하고, 그 위에 추가 동작을 더해준다.

실행 결과

fun main() {
    val multiClassCharacter = Character()

    // 다양한 직업 특성을 활용
    multiClassCharacter.shootArrow() // 궁수 능력
    multiClassCharacter.sing()       // 가수 능력
    multiClassCharacter.attack()     // 전사 능력
    multiClassCharacter.steal()      // 도적 능력
}

궁수가 화살을 쏩니다!
화살을 더욱 정확히 맞춥니다!
가수가 노래를 부릅니다!
청중이 감동받습니다!
전사가 공격합니다!
강력한 일격을 날립니다!
도적이 물건을 훔칩니다!
아무도 눈치채지 못합니다!

 

마무리

코틀린에서 인터페이스와 super를 활용하면 다중 상속처럼 다양한 특성을 조합하여 캐릭터를 설계할 수 있다.

다양한 객체 지향 프로그래밍 상황에서 유용하게 사용할 수 있다.

 

반응형
LIST