[Kotlin] 오버라이딩, 추상화, 인터페이스 설명 & 예제

728x90

오버라이딩

상속에서는 기본적으로 수퍼클래스와 같은 속성을 가진 서브클래스를 만들수 없다

fun a(v: Int) -> (x) fun a(v: Int)

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

fun main() {
    var t = Tiger()

    t.eat()
}

open class Animal {
    //eat 함수를 오버라이드 하기 위해 open
    open fun eat() {
        println("음식을 먹습니다.")
    }
}

class Tiger : Animal() {
    //open 이 붙은 함수를 override
    override fun eat() {
        println("고기를 먹습니다.")
    }
}

추상화

선언부만 있고 기능이 구현되지 않은 추상함수 , 추상함수를 포함하는 추상클래스로 구성되어 있다.

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

따라서 반드시 상속받고 abstract 표시가 된 함수를 구현해줘야 한다.

fun main() {

    var r = Rabbit()

    r.eat()
    r.sniff()
}

//추상함수 = 빈껍데기
abstract class Animal {
    abstract fun eat()
    fun sniff() {
        println("킁킁")
    }
}

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

추상화를 하는 또다른 방법 : interface

코틀린에서 인터페이스는 속성, 추상함수, 일반함수 모두 가질 수 있다.
다만, 추상함수는 생성자를 가질 수 있는 반명 인터페이스는 가질 수 없다.

인터페이스에서
구현부가 있는 함수 -> open 함수
구현부가 없는 함수 -> abstract 함수로 간주

따라서 별도 키워드가 없어도 서브클래스에서 구현 및 재정의 가능


또한 한번에 여러 인터페이스 상속 받을 수 있으므로 좀더 유연한 설계 가능

fun main() {
    //두 인터페이스의 형식들을 모두 물려받아 사용하는 서브클래스가 됨
    var d = Dog()

    d.run()
    d.eat()

}

interface Runner {
    //구현부 없는 함수
    fun run()
}

interface Eater {
    fun eat() {
        println("음식을 먹습니다.")
    }
}

class Dog : Runner, Eater {
    //구현부 없는 run
    override fun run() {
        println("우다다다 뜁니다")
    }

    //구현부 있는 override 재구현
    override fun eat() {
        println("허겁지겁 먹습니다.")
    }
}

 

정리

오버라이딩 -> 이미 구현이 끝난 함수의 기능을 서브클래스에서 변경해야 할때
추상화 -> 형식만 선언, 실제 구현은 서브클래스에 일임할때 사용
인터페이스 -> 서로 다른 기능들을 여러개 물려주어야 할떄 유용한 기능

728x90

댓글

Designed by JB FACTORY