프로그래밍 언어/Kotlin

Kotlin의 class(2) - abstract class와 interface

Julie825 2022. 10. 3. 21:21

상속 - open

Kotlin에 equals(), hashCode(), toString()  메서드를 가지는 Any라는 클래스가 있는데,

Kotlin의 모든 클래스는 이 Any를 상속받는 자식 클래스이다.

 

Any를 상속받는건 간단하지만 내가 만든 클래스를 다시 내가 만들 클래스에 물려주는 것은 그냥은 안된다.

open 키워드를 사용해서 정확이 이 클래스가 상속될 것임을 알려줘야한다.

open class Base(p: Int){
	open fun able(){...} // override 가능
	fun forbidden(){...} // 불가능
	open val over = 0
}
// 부모 클래스는 반드시 primary constructor를 사용해서 초기화되어야한다.

class Derived(p: Int) : Base(p){
// 자식 클래스에 primary constructor가 없다면 decondary constructor에 super 키워드로
// base type을 초기화해야한다.
	constructor (p:Int):super(p) // 이런 식으로..
	override fun able() {...}
	override fun able() {...} // final이 붙어서 자식클래스는 able을 상속할 수 없다.

	override var over = 1 // val -> var은 가능. 반대는 안됨
	
}

더 자세한 내용은 여기로

https://kotlinlang.org/docs/inheritance.html#derived-class-initialization-order

 

상속할 함수의 틀만 제공하는 클래스 - abstract class

구현이 하나도 안되어있는 메서드의 경우 open 대신 abstract를 적어준다.

abstract method를 하나라도 포함하고 있으면 그 클래스는 abstract class가 된다.

 

 

아무 속성도 초기화하지 않을 때 - Interface

Interface는 아무런 상태값도 저장하지 않는 형태의 클래스를 만들고싶을 때 사용할 수 있는 키워드이다.

Interface를 상속받아 abstract class를 만들거나, Interface 안에 Interface를 inner class로 가지거나, Interface를 상속받아 일반 클래스를 만드는 것 모두 가능하다.

딱 하나 지켜야하는 것은 속성값을 초기화하지 않는 것이다.

interface MyInterface {
    val prop: Int // abstract

    val propertyWithImplementation: String
        get() = "foo"

    fun foo() {
        print(prop)
    }
}

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

Interface와 abstract class의 차이?

둘다 상속이 가능하다는 공통점이 있지만, 금지되는 사항이 다르다.

abstract class는 메서드가 미리 구현되어있는 것이 금지된다.

interface는 속성값 등으로 state를 저장하는 것이 금지된다.

 


참고한 자료

 

Kotlin 공식문서 - Inheritance : https://kotlinlang.org/docs/inheritance.html#overriding-rules