본문 바로가기

프로그래밍/Kotlin

[Kotlin 요약 정리] 8. 추상 클래스와 인터페이스

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)

}