추상 클래스

추상 클래스를 정의하면 반드시 구현 클래스에서 상속을 하고 추상 속성과 추상 메서드를 구현해야 사용할 수 있음

abstract class A {
    var arg: String = "arg"  // 일반 속성
    abstract val abstArg: String  // 추상 속성

    open fun func() {         // 일반 메서드
        println("일반 메서드")
    }

    abstract fun abstFunc()   // 추상 메서드
}

class B : A() {              // 위임 호출
    override var abstArg: String = "absArg"  //추상 속성 오버라이딩
    override fun abstFunc() {   // 추상 메서드 오버라이딩
        println("추상 메서드")
    }
}

fun main(args: Array<String>) {
    val obj = B()
    println(obj.abstArg)
    obj.abstFunc()
}

absArg 추상 메서드

추상 클래스 내의 초기화 블록 처리

abstract class A(arg: String) {  // 주생성자 정의
    init {                      // 초기화 블록 정의
        println("arg는 $arg")    // 주생성자의 매개변수 사용
    }

    abstract fun abstFunc()
}

class B(arg: String) : A(arg) {

    override fun abstFunc() {
        println("추상 메서드")
    }

}

fun main(args: Array<String>) {
    val obj = B("sumin")
    obj.abstFunc()
}

arg는 sumin 추상 메서드