본문 바로가기

kotlin

코틀린 : 인터페이스와 추상화 코딩해보기!


// Kotlin 에서는 상속 가능한 클래스를 만들 때 class 앞에
//open을 기재해야 합니다.

open class Super{
    //오버라이딩 가능한 메소드를 만들 때 앞에 open을 추가해야합니다.
    open fun method(){

    }
}

// 인스턴스를 생성할 수 없는 추상 클래스
abstract class AbstractClass{
    // 하위 클래스에서 반드시 재정의 해야 하는 추상 메소드
    abstract fun method()
}

//인터페이스
interface Interface{
    fun method() // abstract가 없어도 내용이 없으면 추상 메소드

    var prop1 : String //추상 프로퍼티가 됩니다.
    //var prop2 : String = "adam" //프로퍼티 초기화를 하면 에러

    //val 로 선언한 프로퍼티는 get을 생성해야합니다.
    // field 사용은 안됨
    // 특정한 리터럴을 리턴하는 구조로 만들어야 합니다.
    val prop3 :String
    get() = "adam"


    // var 을 추상 프로퍼티가 아닌 구조로 만들려면
    // get 과 set을 모두 생성해야합니다.
    // field 는 사용할 수 없다
    var prop4 : Int
    get() = 1
    set(value){

    }
}

// 인터페이스 구현을 위한 클래스
class InterfaceImpl:Interface{

    override fun method() {
        // 추상 메소드를 오버라이딩 할 땐 상위 메소드 호출 못함
        //super.method()
        println("추상 메소드 구현")

    }

    override var prop1: String
        get() = TODO("Not yet implemented")
        set(value) {}
}

fun main (args:Array<String>){
    //인터페이스를 변수의 자료형으로 사용해서
    //구현된 클래스의 인스턴스를 대입해서 메소드 호출
    //인터페이스나 추상 클래스를 상속 받아서 사용하는 경우에
    //변수의 자료형은 인터페이스나 추상 클래스로 많이 하고
    //인스턴스를 대입 해서 사용하는 형태로 코드를 많이 작성
    var i : Interface = InterfaceImpl()
    i.method()
}

 

인터페이스에 일반 메소드 생성이 가능 

> 일반 메소드를 만들면 추상 메소드가 아닌 default method가 만들어 집니다.

 

여러 인터페이스나 클래스의 인터페이스에 중복된 메소드가 존재하는 경우

1) 추상메소드가 여러개인 경우

=> 메소드 한 개만 구현 하면 됩니다.

2) 이미 구현된 메소드가 여러 개인 경우 하위 클래스에서 메소드 호출 방법

super<인터페이스나 클래스 이름>.메소드이름()