티스토리 뷰

Kotlin

코틀린 인터페이스 Kotlin Interface

IT Knowledge Share 2021. 7. 6. 19:30
반응형

인터페이스는 일종의 약속을 의미합니다. 여기서 약속은 인터페이스의 함수를 구현해야 한다는 약속입니다.

 

상속의 개념과 헷갈릴 수 있는데, 상속은 부모 클래스의 함수나 변수를 물러 받아서 사용하며, 자식 클래스에서 이를 그대로 사용하거나 변경해서 사용해도 된다는 부분입니다.

 

이와 다르게 인터페이스를 구현하게 되는 클래스는 인터페이스에 있었던 함수를 반드시 완성해야 합니다. 인터페이스에 있었던 함수가 이미 완성된 경우, 완성할 필요는 없습니다.

 

예문을 통해 더 자세히 살펴 봅니다.

fun main(args: Array<String>){
    val student1 : Student1 = Student1()
    student1.eat()
    student1.sleep()
}
interface Person1 {
    fun eat()
    fun sleep()
    fun walk(){
      println("걷는다")
    }
}

class Student1 : Person1 {
    override fun eat() {
       println("먹는다")

    }

    override fun sleep() {
       println("잔다")
    }
    
    override fun walk(){
      println("걷는다")
    }
}
반응형
open class Person(){
    open fun eat(){
	 println("먹는다")
    }

    fun sleep(){
       println("잔다")
    }
}

class Student() : Person(){
    override fun eat() {
        super.eat()
    }
}

 

위의 예문을 살펴보면, Person1을 인터페이스 예약어로 구현한 것을 볼 수 있습니다. interface를 명칭 앞에 불이면 인터페이스가 됩니다.

Person1 인터페이스는 3가지 함수를 가지고 있는데, eat, sleep, walk 입니다. 이중 eat, sleep은 미완성된 함수이며, walk는 이미 완성된 함수입니다. 완성/미완성의 차이는 중괄호 {  }의 유무를 통해 파악하시면 좋을 것 같습니다.

 

student1 클래스에서 Person1 인터페이스를 받게 되는데, 상속과 다르게 인터페이스를 받을 때는 타입으로 Person1( )이 아닌 Person1으로 타입을 받습니다. 그 이유는 인터페이스는 생성자의 개념이 없기 때문입니다.

 

student1에서 인터페이스를 타입으로 받은 후, 상속과 마찬가지로 마우스 우클릭 -> Generate -> Implement를 눌러서 인터페이스를 구현합니다. 앞서 설명한 바와 같이, 인터페이스에서 미완성되었던 eat( ), sleep( )만 구현하면 되며, walk( )는 그냥 두어도 무방합니다. eat과 sleep을 구현하지 않으면 에러가 발생합니다.

 

맨 아래 예문은 상속의 예시입니다. 인터페이스와 비교하기 위해 작성한 것인데, 상속은 부모 클래스 명칭 앞에 open 키워드를 사용하며, 자식 키워드가 타입으로 부모 클래스를 타입으로 받으면서 상속이 시작됩니다. 이때 타입이 Person이 아닌 Person( )인 점을 주의하십시오. 이는 상속에는 생성자가 필요할 수 있기 때문입니다.

 

인터페이스는 클래스와는 다른 개념입니다. 클래스가 설명서라면, 인터페이스는 일종의 강요서라고 볼 수 있습니다. 그 이유는 인터페이스를 구현하는 클래스는 반드시 인터페이스의 모든 함수를 완성시켜야 하기 때문입니다.

 

그럼 언제 상속을 사용하고, 언제 인터페이스를 쓰는 것이 좋을까요?

상속은 부모 클래스의 메소드를 오버라이딩한 후, 그대로 사용하거나 조금 변경하여 사용하게 되지만, 인터페이스는 안에 포함된 미완성 메소드를 처음부터 끝까지 모두 구현해야 합니다.

 

이 부분에서 언제 어떤 것을 사용할지 조금 감을 잡으시기 바랍니다. 상속받거나 또는 인터페이스를 받는 메소드 자체가 완성시켜야 되는 부분이 많다면 인터페이스를 쓰는 것이 좋습니다. 반대로, 부모 클래스 또는 인터페이스로부터 받게되는 메소드 자체가 별로 완성지을 것이 없다면, 상속으로 처음부터 정의하는 것이 좋습니다.

반응형
댓글