문서비공식 한국어 번역
GitHub문서

인터페이스

 이 페이지의 마지막 수정: 2024년 10월 7일 
 ...

Kotlin 의 인터페이스들은 추상 함수들의 선언을 비롯한 함수의 구현을 가질 수 있습니다. 추상 클래스와의 차이점은 인터페이스들은 상태를 가질 수 없다는 점입니다. 프로퍼티를 가질 수는 있으나, 추상 프로퍼티이거나 접근자 구현만을 제공할 수 있습니다.

인터페이스는 interface 키워드를 사용해 정의됩니다:

1interface MyInterface {
2    fun bar()
3    fun foo() {
4      // optional body
5    }
6}
7

인터페이스의 구현

클래스나 오브젝트는 하나 이상의 인터페이스를 구현할 수 있습니다:

1class Child : MyInterface {
2    override fun bar() {
3        // body
4    }
5}
6

인터페이스의 프로퍼티

인터페이스에는 프로퍼티를 정의할 수 있습니다. 인터페이스의 프로퍼티는 추상적이거나 접근자에 대한 구현 중 하나의 형태로 가능합니다. 인터페이스에 정의된 프로퍼티는 기반 필드를 가질 수 없으며, 그렇기 때문에 인터페이스에 정의된 접근자들이 참조할 수 없습니다:

1interface MyInterface {
2    val prop: Int // abstract
3
4    val propertyWithImplementation: String
5        get() = "foo"
6
7    fun foo() {
8        print(prop)
9    }
10}
11
12class Child : MyInterface {
13    override val prop: Int = 29
14}
15

인터페이스의 상속

인터페이스는 다른 인터페이스로부터 파생될 수 있으며, 이는 그 다른 인터페이스를 구현하고 또다른 함수와 프로퍼티를 정의할 수 있음을 의미합니다. 물론이지만, 이러한 파생된 인터페이스들을 클래스가 구현할 때는 멤버 중 구현이 없는 것들만 추가하면 됩니다:

1interface Named {
2    val name: String
3}
4
5interface Person : Named {
6    val firstName: String
7    val lastName: String
8
9    override val name: String get() = "$firstName $lastName"
10}
11
12data class Employee(
13    // implementing 'name' is not required
14    override val firstName: String,
15    override val lastName: String,
16    val position: Position
17) : Person
18

재정의 충돌 해결하기

슈퍼타입 목록에 여러 타입이 있다면, 같은 함수에 대해 서로 다른 구현이 있을 수도 있습니다:

1interface A {
2    fun foo() { print("A") }
3    fun bar()
4}
5
6interface B {
7    fun foo() { print("B") }
8    fun bar() { print("bar") }
9}
10
11class C : A {
12    override fun bar() { print("bar") }
13}
14
15class D : A, B {
16    override fun foo() {
17        super<A>.foo()
18        super<B>.foo()
19    }
20
21    override fun bar() {
22        super<B>.bar()
23    }
24}
25

인터페이스 AB 는 모두 foo()bar() 를 정의합니다. 둘 모두 foo() 를 구현하며, Bbar() 를 구현합니다(bar()A 에서 추상적으로 표기되지 않았습니다, 이는 인터페이스에서 몸체가 없는 함수는 기본적으로 추상적이기 때문입니다). 이제, A 로부터 C 를 파생하려면 bar() 만을 재정의하여 구현하면 됩니다.

그러나 DAB 로부터 파생하려고 한다면, 이 인터페이스들의 모든 함수들을 재정의해야 하며, D 가 정확히 어떤 행동을 해야하는지 명확히 해야합니다. 이 규칙은 하나의 구현을 확장한 함수(bar())와 두 개의 서로 다른 구현을 확장한 함수(foo())에 대해 적용됩니다.

이 페이지가 도움이 되셨다면, 원문 페이지에 방문해 엄지척을 해주세요!