코틀린의 인터페이스는 자바 8 인터페이스와 매우 유사하다. 추상 메서드를 선언할 수 있고 또한 메서드 구현을 포함할 수 있다
추상 클래스와 비슷하다고 생각할 수 있지만 선언 시 사용되는 키워드부터 해서 몇 가지 다른 점이 있다.
- 인터페이스는 상태를 가질 수 없다.
- 다중 상속이 가능하다
- open 키워드를 일일이 붙일 필요 없다.
인터페이스는 interface 키워드를 사용하여 정의할 수 있다.
interface MyInterface{
fun bar()
fun foo(){
//optional body
}
}
인터페이스 구현
클래스나 객체는 한 개 이상의 인터페이스를 구현할 수 있다.
class Child : MyInterface{
override fun foo(){
// body
}
}
인터페이스의 속성(Property)
인터페이스에서 속성을 선언할 수 있다. 인터페이스에 선언된 속성은 추상이거나 접근자에 대한 구현을 제공할 수 있다. 인터페이스는 지원(Backing) 필드를 가질 수 없으므로, 인터페이스에 선언한 프로퍼티에서 참조할 수 없다.
interface MyInterface{
val prop: Int
//접근자에 대한 구현
val propertyWithImplementation: String
get() = "foo"
fun foo(){
print(prop)
}
}
class Child : MyInterface{
override val prop: Int = 29
}
인터페이스 상속
인터페이스는 다른 인터페이스에서 파생될 수 있다. 즉, 해당 멤버에 대한 구현을 제공하고 새 함수 및 속성을 선언할 수 있다. 이러한 인터페이스를 구현하는 클래스는 누락된 구현부만 정의하면 된다.
fun main(){
var m = Employee("first", "second", "position")
println("first = ${m.firstName}\n" +
"second = ${m.lastName}\n" +
"position = ${m.position}")
}
interface Named {
val name: String
}
interface Person : Named {
val firstName: String
val lastName: String
override val name: String get() = "$firstName $lastName"
}
data class Employee(
//name은 이미 재정의 되어있기 때문에 필요없다.
override val firstName: String,
override val lastName: String,
val position: Position
) : Person
first = first
second = second
position = position
오버 라이딩 충돌 해결
여러 개 상속받으면 오버 라이딩해야 하는 메서드가 중복될 수 있다.
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()
}
}
그럴 땐 그냥 오버 라이딩하고 부모 클래스의 기능이 필요하면 super <Parent>. function()을 통해 호출하면 된다.
A를 상속받은 C는 추상 메서드인 bar()만 구현하면 되지만 D의 경우 인터페이스에서 A, B에서 상속한 모든 메서드를 구현해야 하며 D가 구현하는 방법을 정확히 지정해야 한다. 정확하게 하려면 꺽쇠기호를 이용하여 super<Parent>.method() 로 지정할 수 있다. 이 규칙은 다중구현(foo)을 상속한 메서드뿐만 아니라 단일구현(bar)을 상속한 메서드 모두에 적용된다.
'코틀린' 카테고리의 다른 글
가시성 수식어(Visibility modifiers) (0) | 2023.02.02 |
---|---|
Functional (Single Abstract Method) Interface (1) | 2023.02.02 |
프로퍼티와 필드 (0) | 2023.01.31 |
클래스와 상속 (0) | 2023.01.30 |
흐름제어 (0) | 2023.01.30 |