코틀린(Kotlin)

코틀린(kotlin) : 인터페이스 Interface

알통몬_ 2018. 1. 30. 17:30
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


이번 포스팅에서는 코틀린의 인터페이스에 대해서 공부합니다.


인터페이스

코틀린의 인터페이스는 Java8 과 유사합니다.

abstract 메서드를 선언할 수 있고, 메소드를 구현할 수도 있습니다.

추상 클래스와 다른 점은 상태를 저장할 수 없다는 점입니다.


인터페이스의 선언 및 클래스의 인터페이스 상속 및 메서드 오버라이딩


interface BBB {

fun aaa()

fun bbb() {
print("print BBB()")
}
}

class AAA : BBB {
var name = "aaa"
override fun bbb() {
print("print bbb()")
}

override fun aaa() {
print("print aaa()")
}
}


인터페이스는

언급했던 것처럼, 추상 메서드를 가질 수 있고, {} 을 가지는 메서드 구현도 할 수 있습니다.

그리고 그 인터페이스를 상속받은 클래스는 인터페이스에 선언된 추상 메서드들은 꼭

오버라이딩해야 합니다. 


인터페이스는 프로퍼티도 가질 수 있는데요.

추상 프로퍼티 또는 accessor 를 가지는 프로퍼티를 가질 수 있는데요.

인터페이스 안에 프로퍼티를 선언할 경우 backing properties를 가질 수 없습니다.

interface MyInterface {
val prop: Int // abstract

val propWithImpl: String
get() = "aaa"

fun aaa() {
print(prop)
}
}

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

인터페이스에 프로퍼티 선언 시 값을 초기화 해주지 않으면 추상 프로퍼티가 됩니다.


우선 순위 충돌의 해결

만약 Impl 라는 클래스가 A, B 라는 인터페이스를 둘 다 상속받는다고 할 때

두 인터페이스에 같은 이름의 메서드 구현이 있을 경우는 어떻게 해야할까요?

공부했던 개념대로라면 ImplOne 처럼 하나의 인터페이스를 상속받을 때는

메서드의 구현은 오버라이딩 하지 않아도 상관이 없었습니다.


하지만 ImpleTwo 처럼 두 인터페이스를 상속 받고, 그 인터페이스들에

같은 이름의 메서드 구현이 있다면, 해당 메서드는 꼭 오버라이딩을 해주어야 합니다.

interface A {
fun aaa() {
print("aaa")
}

fun bbb()
}

interface B {
fun aaa() {
print("aaa")
}

fun bbb() {
print("bbb")
}
}

class ImplOne : A {
override fun bbb() {
print("bbb")
}
}

class ImpleTwo : A, B {
override fun aaa() {
print("aaa")
}

override fun bbb() {
print("bbb")
}

}


이상입니다.

다음 포스팅에서는 접근 제한자에 대해서 공부합니다.


반응형