본문 바로가기
코틀린

코틀린(10) - 오버라이딩 , 추상화, 인터페이스

by 왈레 2022. 3. 21.

오버라이딩

상속시에는 기본적으로 슈퍼클래스에 있는 함수와 같은 이름과 형태를 가진 함수는 서브클래스에서 만들 없다.

하지만 수퍼클래스에서 허용만 한다면 "오버라이딩"이라는 방법으로 서브클래스에서 같은 이름과 형태로 함수의 내용을 다시 구현할 있다.

fun main() {
   var t = Tiger()
   t.eat()
}
open class Animal{
    open fun eat(){
        println("음식을 먹습니다.")
    }
}
class Tiger : Animal(){
    override fun eat(){
        println("고기를 먹습니다.")
    }
}

 

추상화

수퍼클래스에서는 함수의 구체적인 구현은 없고 단지 Animal 모든 서브클래스는 eat이라는 함수가 "반드시 있어야 한다" 점만 명시하여 서브클래스가 비어있는 함수의 내용을 필요에 따라 구현하도록 하려면 "추상화"라는 개념을 사용한다.

 

추상화는 선언부만 있고 기능이 구현되지 않은 "추상함수" 그리고 추상함수를 포함하는 "추상클래스"라는 요소로 구성된다.

abstract class Animal{
    abstract fun eat() // *추상함수는 비어있는 껍데기라고 생각하세요.
    
    fun sniff(){
    	println("킁킁")
    }
}

이렇게 abstract 붙인 추상클래스는 일부 함수가 구현되지 않은 "미완성 클래스"이기 때문에 단독으로는 인스턴스를 만들 없다.

따라서 반드시 서브클래스에서 상속을 받아 abstract표시가 함수들을 구현해줘야 한다.

abstract class Animal{
    abstract fun eat()
    
    fun sniff(){
    	println("킁킁")
    }
}
class Rabbit : Animal( ) {
    override fun eat( ) {
    	println("당근을 먹습니다.")
    }
}

 

인터페이스

추상화를 하는 다른 방법으로 인터페이스가 있다.

 

다른 언어에서 원래 인터페이스는 추상함수로만 이루어져 있는 "순수 추상화 기능" 말하는 것이라고 알고있을텐데 코틀린에서는 인터페이스가 (속성),추상함수,일반함수 모두를 가질 있다.

 

다만 추상함수는 생성자를 가질 있는 반면, 인터페이스는 생성자를 가질 수는 없으며 인터페이스에서 구현부가 있는 함수 -> open함수로 간주.

 

구현부가 없는 함수 -> abstract 함수로 간주 하기때문에 별도의 키워드(open/구현부가있는함수 , abstract/구현부가 없는 함수) 없어도 포함된 모든 함수를 서브클래스에서 구현 재정의가 가능하다, 또한 한번에 여러 인터페이스를 상속받을 있음으로 유연한 설계가 가능하다.

 

인터페이스 2개를 한번에 상속받는 클래스

fun main( ) {
    var d = Dog( )
    d.run( )
    d.eat( )
}
interface Runner {
	fun run( ) // 구현부가 없는abstract 함수
}

interface Eater {
    fun eat( ) { // 구현부가 있는 open 함수
    	println("음식을 먹습니다")
    }
}

 

class Dog :  Runner, Eater { // *Dog 클래스로 두 인터페이스를 상속받는법
    override fun run( ){
    	println("우다다다 뜁니다")
	}

    override fun eat( ){
    	println("허겁지겁 먹습니다")
    }
}

정리하면 오버라이딩은 이미 구현이 끝난 함수의 기능을 서브클래스에서 변경해야 , 그리고 추상화는 형식만 선언하고 실제 구현은 서브클래스에서 일임할 사용하는 기능이며, 인페페이스는 서로 다른 기능들을 여러 물려주어야할 유용한 기능이다.

댓글