코틀린

[Youtube DiMo] 10-11강. 상속(오버라이딩, 추상화)

iseohyun 2022. 4. 29.

목차

    https://youtu.be/Mpn-kGFxB84

    https://youtu.be/P3Dp7YRwD_E

     

    1. 상속

    기존의 코드에 기능을 조금만 수정하여 새로운 기능의 단위를 만들어 내는 작업
    상속 문법 :
    1. 상속가능 키워드 open이 부모 클래스에서 선언되어야 함.
    2. class 자식클래스(속성들) : 부모클래스(속성들) {바디}
    fun main() {
        var a = Animal("나비", 3, "고양이")
        var b = Dog("흰둥이", 2)
        
        a.whoAmI()
        b.whoAmI()
    }
    
    open class Animal(var name : String, var age : Int, var type : String){
        fun whoAmI() { println("$name / $age / $type")}
    }
    
    class Dog (name : String, age : Int) : Animal(name, age, "개") {
        fun bark() { println("멍멍") }
    }
    나비 / 3 / 고양이
    흰둥이 / 2 / 개

     

     

    2. Override 덮어쓰기(처럼보이기)

    같은 이름의 함수를 선언함으로써, 기존의 함수를 대체하는 효과를 줌
    ※ 후대의 객체는 항상 선대의 객체보다 더 많은 기능을 하게 되다는 점 명심
    문법
    1. 덮어쓸 함수를 부모객체에서 open으로 추가
    2. 재정의 할 함수에 override를 추가
    fun main() {
        var a = Animal("나비", 3, "고양이")
        var b = Dog("흰둥이", 2, "강아지")
        
        a.whoAmI()
        b.whoAmI()
        b.whoAmI2()
    }
    
    open class Animal(var name : String, var age : Int, var type : String){
        // open 키워드가 추가되었다.
        open fun whoAmI() { println("$name / $age / $type")}
    }
    
    class Dog (name : String, age : Int, type : String) : Animal(name, age, type) {
        fun bark() { println("멍멍") }
        // override
        override fun whoAmI() {
            println("$name / $age / \"멍멍\"")
        }
        fun whoAmI2(){ super.whoAmI() }
    }
    나비 / 3 / 고양이
    흰둥이 / 2 / "멍멍"
    흰둥이 / 2 / 강아지

     

     

    3. 추상화

    추상화의 목적은 코드를 구조화하기 위해서 멤버함수를 "선언만" 해둔 상태에서,
    이후에 작성될(상속받은) 객체에서 필수적으로 해당 함수를 포함하게끔 하는 기법
    당연히 상속받은 객체는 해당함수를 갖으므로 다형성을 만족하게 됨
    문법 : 
    1. 부모 클래스에 abstract 키워드 추가, 추상화할 함수에 abstract 추가
    2. 자식
    fun main() {
        var a = Dog("흰둥이", 2, "강아지")
        
        a.whoAmI()
    }
    
    abstract class Animal(var name : String, var age : Int, var type : String){
        // abstract 함수는 body가 없다.
        abstract fun whoAmI()
    }
    
    class Dog (name : String, age : Int, type : String) : Animal(name, age, type) {
        // 추상화 대상은 반드시 override되어야 한다.
        override fun whoAmI() {
            println("$name / $age / $type")
        }
    }
    흰둥이 / 2 / 강아지

     

     

    4. 인터페이스

    인터페이스는 속성(변수)를 갖을 수 없는 클래스
    기본적으로 추상화 함수를 포함하며, abstract가 생략된 형태
    문법 : 
    interface 인터페이스명 {바디}
    fun main() {
        var a = Animal("흰둥이", 2, "강아지")
        
        a.whoAmI()
        a.run()
        a.eat()
    }
    
    interface Runable {
        fun run()
    }
    
    interface Eatable {
        fun eat() { println("함냐함냐") }
    }
    
    class Animal(var name : String, var age : Int, var type : String)
    	: Runable, Eatable
    {
        fun whoAmI() { println("$name / $age / $type") }
        override fun run() { println("다다다다") }
    }
    흰둥이 / 2 / 강아지
    다다다다
    함냐함냐

     

    다형성의 예시

    fun main() {
        var a = Dog("흰둥이")
        var b = Cat("나비")
        var r : Runable = a
        
        r.run()
        
        r = b
        r.run()
    }
    
    interface Runable {
        fun run()
    }
    
    class Dog(var name : String) : Runable
    {
        override fun run() { println("${name}가 다다다다") }
    }
    
    class Cat(var name : String) : Runable
    {
        override fun run() { println("${name}가 도도도도") }
    }
    흰둥이가 다다다다
    나비가 도도도도

    댓글