코틀린 강좌 #10 오버라이딩과 추상화

Kotlin/기본 문법 · 2020. 12. 17. 14:32

테크과학! DiMo

 

테크과학! DiMo

개발자가 얘기하는 생활 속 IT기술에 대한 과학! 여러분이 몰랐던, 혹은 정확히 알지 못했던 IT 테크놀러지를 파드립니다! 좋은 영상을 위한 채널 후원, 투네이션을 통해서 해주세요! 후원링크 htt

www.youtube.com

 

 

개발 환경: play.kotlinlang.org


상속 시에는 기본적으로

 


수퍼 클래스에 있는 함수와 같은 이름과 형태를 가진 함수는 서브 클래스에서 만들 수 없다

 


하지만 수퍼클래스에서 허용만 한다면 오버라이딩으로 서브클래스에서 같은 이름과 형태로 된 함수의 내용을 다시 구

 

 

현 할 수있다.

 

open class Animal {
    // open을 붙이면 서브클래스에서 재구현이 허용된다.
    open fun eat() {
        println("음식을 먹습니다.")
    }
}

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

출력:
고기를 먹습니다.

 

추상화

 

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

 

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("당근을 먹습니다.")
    }
}

출력:
당근을 먹습니다.
킁킁

 

다른 언어에서의 인터페이스


추상함수로만 이루어져 있는 '순수 추상화 기능'을 말하는 것

 

 


코틀린 에서의 인터페이스


인터페이스 역시 추상 함수와 일반 함수 모두를 가질 수 있다.

 

다만 추상함수는 생성자를 가질 수 있는 반면 인터페이스는 생성자를 가질 수 없다.

 

 

인터페이스에서 구현부가 있는 함수 -> open 함수

 

구현부가 없는 함수 -> abstract 함수로 간주

 

 

별도의 키워드가 없어도 포함된 모든 함수를 서브클래스에서 구현 및 재정의가 가능하다.

 

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

 

 

주의 해야 할 점

 

여러개의 인터페이스나 클래스에서 같은 이름과 형태를 구현하고 있다면 서브클래스에서 혼선이 일어나지 않도록


override를 이용하여 재구현 해줘야 한다.

 

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("음식을 왕창 먹습니다.")
    }
}

출력:
뛰는 중
음식을 왕창 먹습니다.