개발일지

Kotlin in A..Z (19) - 인터페이스 본문

Kotlin (코틀린)

Kotlin in A..Z (19) - 인터페이스

강태종 2020. 7. 17. 10:27

- 인터페이스 (interface)

  • 추상 클래스는 클래스이기 때문에 상속에 관하여 문제점을 야기할 수 있다. (이중 상속, 상속으로 인한 강한 연관성
  • 추상 클래스와 비슷한 개념이지만 프로퍼티를 통해 상태를 저장할 수 없다.
  • abstract 키워드가 생략되어도 자동으로 붙는다.

코드

interface Test {
    // abstract 키워드 없이 자동으로 추상 프로퍼티, 값을 초기화 할 수 없음
    val value:Int
    
    // Java의 default처럼 메소드를 정의할 수 있음
    fun action1() {
        println("Test Action1")
    }
    
    // abstarct 키워드 없이 자동으로 추상 메소드
    fun action2()
}

class Parent : Test {
    // override 키워드를 통해 재정의
    override val value: Int = 0

    // override 키워드를 통해 재정의
    override fun action2() {
        println("Parent Action2")
    }
}

fun main() {
    val parent = Parent()
    
    parent.action1()
    parent.action2()
}

 

결과

Test

- 인스턴스 getter를 이용한 프로퍼티 초기화

getter를 이용하여 마치 프로퍼티를 초기화한 것 처럼 표현할 수 있다. 하지만 getter와 setter에 사용하던 value와 field를 사용할 수 없다.

 

코드

interface Test {
    val value:Int
        get() = 0 
}

- 이름이 같은 메서드를 가진 인터페이스의 구현

  • 동일한 이름을 가진 추상 프로퍼티와 추상 메소드는 하나로 통일하여 구현한다.
  • 이미 구현된 메소드는 재정의한다.

 

코드

interface A {
    val value: Int

    fun func()
    fun action() {
        println("A Action")
    }
}

interface B {
    val value: Int

    fun func()
    fun action() {
        println("B Action")
    }
}

class Test : A, B {
    override val value: Int = 0

    override fun func() {
        println("하나만 구현하면 된다.")
    }

    override fun action() {
        // super<?> 키워드로 특정 인터페이스의 함수를 접근할 수 있음
        // 동일한 이름의 가진 메소드는 반드시 재정의해야한다.
        super<A>.action()
        super<B>.action()
    }
}

- 인터페이스 위임

by 위임을 통해 인터페이스의 프로퍼티와 메소드를 바로 접근할 수 있다.

 

코드

interface Run {
    fun run() {
        println("Run")
    }
}

interface Fly {
    fun fly() {
        println("Fly")
    }
}

class Animal(private val run: Run, private val fly: Fly) : Run by run, Fly by fly {
    fun action() {
        // 인터페이스를 통해 위임 받았기 때문에 바로 접근할 수 있음
        run()
        fly()
    }
}

 

Comments