코틀린 기초_3

h_hi·2021년 2월 2일
0

kotlin

목록 보기
3/10

클래스의 상속 (inheritance)

-> 상속 이란 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 말합니다. 상속하는 클래스를 super class , 상속받는 클래스를 sub class 라고 합니다.

  • 코틀린의 최상위 클래스는 Any 입니다. 즉, Any 로 선언 시 모든 데이터 타입이 대입될 수 있습니다. Any 클래스의 내부엔 equals(), hashCode(), toString()등의 메소드가 있습니다.

    ✓ 코틀린의 Any와 자바의 Object 의 차이점
    Any 를 자바로 디컴파일 해보면 Object 타입으로 변환됩니다. Any 에는 wait(), notify(), notifyAll() 과 같은 쓰레드를 제어하는 메소드가 없습니다. 사용하려면 (any as Object).notify() 와 같은 형변환이 필요합니다.

  • java 의 상속 키워드가 extends 인 것처럼 코틀린의 상속 키워드는 : (콜론) 입니다.

  • 코틀린의 클래스, 메소드는 기본적으로 final 타입으로 상속이 불가합니다. 상속을 허용하려면 클래스 앞에 open 키워드를 사용해 명시해 주어야 합니다.

오버라이딩과 추상화

오버라이딩 (overriding)

-> 이미 구현이 끝난 함수의 기능을 서브 클래스에서 재정의해서 사용하는 것을 의미합니다.

추상 클래스 (abstract class)

-> 구현되지 않고 형식만 선언된 추상 메소드를 가진 클래스를 의미합니다. 추상클래스는 상속을 통해 생성될 자식 클래스에게 메소드 오버라이딩에 강제성을 주기 위해 사용합니다.

인터페이스 (interface)

-> 서로 다른 기능들을 여러 개 물려주어야 할 때 사용합니다. 반드시 구현되어야 할 메소드와 프로퍼티를 선언합니다.

✓ 인터페이스와 추상클래스의 차이점

  • 인터페이스는 다중 상속이 가능하고, 추상클래스는 하나의 추상클래스만 상속가능합니다.
  • 인터페이스는 기본이 open 이므로 open 을 명시할 필요가 없지만, 추상클래스는 final 이 기본이므로 open 을 반드시 명시해 주어야 합니다.
  • 인터페이스는 여러사람이 사용하기 위해 큰 틀을 잡아 놓은 설계도, 추상클래스는 상속받았을 때, 반드시 재정의 되어야 할 메소드를 위해 사용된다고 생각하면 됩니다.

⌨️

fun main() {
    val a : Animal = Dog("꼬봉", 7)
    a.introduce()
    val b = Dog("복이", 3)
    b.introduce()
    b.bark()
    val c = Cat("나비", 5)
    c.introduce()
    c.meow()
    val d = Pigeon("구구", 10)
    d.introduce()
    d.fly()
}

open abstract class Animal(var name: String, var age: Int, var type: String) {
    open abstract fun introduce()
}

class Dog(name: String, age: Int) : Animal(name, age, "개") {
    override fun introduce() { // open 이므로 override 가능
        println("저는 개 : $name 이고, $age 살 입니다.")
    }

    fun bark() {
        println("멍멍")
    }
}

class Pigeon(name: String, age: Int) : Animal(name, age, "비둘기"), Bird {
    override fun introduce() {
        println("저는 비둘기 :$name 이고, $age 살 입니다.")
    }

    override fun fly() {
        println("구구구구구..")
    }
}

class Cat(name: String, age: Int) : Animal(name, age, "고양이") {
    override fun introduce() {
        println("저는 고양이 : $name 이고, $age 살 입니다.")
    }
    fun meow() {
        println("야옹야옹")
    }
}

interface Bird {
    fun fly()
    val name: String
}

👉

저는 개 : 꼬봉 이고, 7 살 입니다.
저는 개 : 복이 이고, 3 살 입니다.
멍멍
저는 고양이 : 나비 이고, 5 살 입니다.
야옹야옹
저는 비둘기 :구구 이고, 10 살 입니다.
구구구구구..

Reference

[Kotlin] *(Star-projections)과 Any의 차이점
디모의 kotlin 강좌

profile
안드로이드, flutter 개발자

0개의 댓글