8. 추상 클래스와 인터페이스
1) 추상 클래스
- 추상 클래스: 추상 함수를 포함하는 클래스
- 추상 함수: 실행 영역이 없는 미완성 함수
- 추상 프로퍼티: 선언부만 있는 프로퍼티
abstract class AbstractEx{
abstract fun function()
abstract val data: String
}
2) 추상 클래스 활용
- 추상 클래스를 상속받아서 다른 클래스를 생성할 수 있다.
- 추상 클래스 자체를 타입으로 활용할 수 있다.
abstract class AbstractEx{
abstract fun function()
abstract val data: String
}
class Class1: AbstractEx(){
override fun function() = println("function1")
override val data: String = "data1"
}
class Class2: AbstractEx(){
override fun function() = println("function2")
override val data: String = "data2"
}
fun someFunction(type: AbstractEx){
println(type.data)
type.function()
}
fun main() {
val cls1 = Class1()
val cls2 = Class2()
someFunction(cls1)
someFunction(cls2)
}
// 결과
data1
function1
data2
function2
3) 인터페이스
- 추상클래스와 같은 방식으로 활용하지만 인터페이스는 클래스가 아니기 때문에 상속이 아닌 구현(implements)을 하며 멤버들을 abstract로 선언할 필요 없다.
interface MyInterface{
fun function()
val data: String
}
class Cls1: MyInterface{
override fun function() = println(data)
override val data: String = "Cls1"
}
class Cls2: MyInterface{
override fun function() = println(data)
override val data: String = "Cls2"
}
fun someFunc(type: MyInterface) = type.function()
fun main() {
someFunc(Cls1())
someFunc(Cls2())
}
// 결과
Cls1
Cls2
4) 인터페이스 다중 구현
- 인터페이스가 다른 인터페이스를 구현할 수 있다.
- 여러개의 인터페이스를 다중 구현할 수 있다.
- 상속과 구현을 동시에 작성할 수 있다.
- 중복된 이름의 멤버가 있을 경우 재정의할 때 super를 이용해서 따로 명시해주어야 한다.( 상속의 경우 super.멤버 / 구현의 경우 super<인터페이스명>.멤버)
interface IF1{
val data : String
}
interface IF2{
fun function2()
}
interface IF3: IF1{
override val data : String
fun function3()
}
open class SomeClass1: IF1, IF2{
override val data: String = "SomeClass1"
override fun function2() = println(data)
}
class SomeClass2: SomeClass1(), IF3{
override val data: String = "SomeClass2"
override fun function2() = println(data)
override fun function3() = println(data)
}
5) 인터페이스에서 프로퍼티 정의
- 규칙
추상형으로 선언하거나 get(), set() 함수를 정의한다.
get(), set() 함수 내에서 field를 사용할 수 없다.
interface MyIF{
var data1 : String
// var data2 : String = "data2" // 에러!
var data2: String
get() = "data2"
set(value) { sum(value) }
// val data3: String = "data3" // 에러!
val data3: String
get() = "data3"
fun sum(value: String)
}
'프로그래밍 > Kotlin' 카테고리의 다른 글
[Kotlin 요약 정리] 10. 함수형 프로그래밍과 람다 (0) | 2019.04.12 |
---|---|
[Kotlin 요약 정리] 9. 코틀린의 클래스 (0) | 2019.04.10 |
[Kotlin 요약 정리] 7. 상속 (0) | 2019.04.09 |
[Kotlin 요약 정리] 6. 프로퍼티 (0) | 2019.04.09 |
[Kotlin 요약 정리] 5. 클래스 (0) | 2019.04.08 |