본문 바로가기

Language/Kotlin

[Kotlin] 오버라이딩, 추상화, 인터페이스

728x90
반응형

오버라이딩

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

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

fun main(){
    var t = Tiger()
    t.eat()  // 고기를 먹습니다
}

open class Animal{
    open fun eat(){
        println("음식을 먹습니다")
    }
}

class Tiger : Animal(){
    override fun eat(){
        println("고기를 먹습니다")
    }
}

추상화

오버라이딩과 다르게 수퍼클래스에서는 함수의 구체적인 구현은 없고 단지 Animal의 모든 서브클래스는 eat이라는 함수가 반드시 있어야 한다는 점만 명시하여 각 서브클래스가 비어있는 함수의 내용을 필요에 따라 구현한다.

 

추상화는 선언부만 있고 기능이 구현되지 않은 추상함수(abstract 키워드 사용), 추상함수를 포함하는 추상클래스(abstract 키워드 사용)로 구성된다.

 

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

fun main(){
    var r = Rabbit()

    r.eat()  // 당근을 먹습니다
    r.sniff()  // 킁킁
}

abstract class Animal{  // 추상클래스
    abstract fun eat()  // 추상함수
    fun sniff(){
        println("킁킁")
    }
}

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

인터페이스

다른 언어에서는 추상함수로만 이루어져 있는 순수 추상화 기능이지만 코틀린에서는 인터페이스 역시 추상함수와 일반함수, 속성 모두를 가질 수 있다.

 

but

  • 추상함수는 생성자를 가질 수 있는 반면 인터페이스는 생성자를 가질 수 없으며
  • 인터페이스에서 구현부가 있는 함수는 open 함수로 간주하고, 구현부가 없는 함수는 abstract 함수로 간주하기 때문에 별도의 키워드가 없어도 포함된 모든 함수를 서브클래스에서 구현 및 재정의가 가능하다.
  • 또한 한 번에 여러 인터페이스를 상속받을 수 있으므로(다중상속) 좀 더 유연한 설계가 가능하다.
fun main(){
    var d = Dog()

    d.run()
    d.eat()
}

interface Runner{
    fun run()
}

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

class Dog: Runner, Eater{
    override fun run(){
        println("우다다다 뜁니다")
    }

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

여러 개의 인터페이스나 클래스에서 같은 이름과 형태를 가진 함수를 구현하고 있다면 서브클래스에서는 혼선이 일어나지 않도록 반드시 오버라이딩하여 재구현 해주어야 한다.

728x90
반응형

'Language > Kotlin' 카테고리의 다른 글

[Kotlin] 스코프와 접근제한자  (0) 2023.09.06
[Kotlin] 기본 프로젝트 구조  (0) 2023.09.05
[Kotlin] 클래스의 상속  (0) 2023.09.05
[Kotlin] 클래스의 생성자  (0) 2023.09.05
[Kotlin] 클래스의 기본 구조  (0) 2023.09.05