Coding Log


Kotlin

본 카테고리는 2017년 Android 공식 언어로 채택된 Kotlin에 관하여 다룬다.

Kotlin을 이용해 개발하는 Android는 추후 따로 다루기로 하고 언어 자체에만 집중한다.

참고 kotlin 공식 사이트

Class - 인터페이스

Kotlin의 인터페이스는 Java 8의 인터페이스와 매우 비슷한다.

인터페이스는 추상 메소드를 선언할 수도 있고, 메소드의 구현 또한 포함할 수 있다.

추상 클래스와 다르게 인터페이스는 상태(state) 를 가질 수 없다는 것이다.

인터페이스는 Property를 가질 수는 있지만 이 Property에 접근하기 위한 접근자를 구현하거나 추상적인 프로퍼티로 선언해야 한다.

인터페이스는 interface 키워드를 사용하여 정의할 수 있다.

아래의 예제 코드를 보자.

interface MyInterface {
    fun bar()
    fun foo() {
      // optional body
    }
}

인터페이스의 구현(Implementing Interfaces)

Kotlin의 클래스나 object는 하나 혹은 그 이상의 인터페이스를 구현할 수 있다.

class Child : MyInterface {
    override fun bar() {
        // body
    }
}

인터페이스의 프로퍼티(Properties in Interfaces)

상술했듯 인터페이스에 프로퍼티를 선언할 수가 있으며, 인터페이스에 선언한 프로퍼티는 추상이거나, 접근자를 구현해서 제공해야 한다.

인터페이스에 선언된 프로퍼티는 지원 필드를 가질 수 없고, 지원 필드를 참조할 수도 없다.

참고 Class - Property와 Field 포스팅

아래 예제 코드를 통해 확인하자.

interface MyInterface {
    val prop: Int // abstract

    val propertyWithImplementation: String
        get() = "foo"

    fun foo() {
        print(prop)
    }
}

class Child : MyInterface {
    override val prop: Int = 29
}

오버라이딩 충돌 이슈 해결(Resolving overriding conflicts)

상위 타입 목록에서 여러 개의 타입을 지정하였을 때, 같은 메소드의 구현체를 1개 이상 상속받을 수 있다.

아래의 예제를 보자.

interface A {
    fun foo() { print("A") }
    fun bar()
}

interface B {
    fun foo() { print("B") }
    fun bar() { print("bar") }
}

class C : A {
    override fun bar() { print("bar") }
}

class D : A, B {
    override fun foo() {
        super<A>.foo()
        super<B>.foo()
    }

    override fun bar() {
        super<B>.bar()
    }
}

위에 예제 코드엔 인터페이스 A B 두 개가 선언되어 있다.

이 두 인터페이스는 foo() bar() 메소드를 전부 포함하고 있는 것을 볼 수 있다.

다른 점으로 인터페이스 A foo()의 구현체는 가지고 있지만 bar()는 추상 메소드로 선언되어 있음을 확인할 수 있고,

반대로 인터페이스 B foo() bar() 두 메소드 모두 구현체를 가지고 있음을 알 수 있다.

참고 abstract를 붙이지 않아도 몸체가 없으면 추상 메소드로 처리된다.

클래스 C bar()의 구현체가 없는 인터페이스 A를 상속받았기 때문에 bar()의 구현체를 구현하였다.

클래스 D는 인터페이스 A B를 둘 다 상속받았기 때문에 모든 메소드를 전부 구현해야 한다.

DISQUS 로드 중…
댓글 로드 중…

트랙백을 확인할 수 있습니다

URL을 배껴둬서 트랙백을 보낼 수 있습니다