카테고리 없음

[Kotlin] 코틀린 클래스 3 오버라이딩 & 추상화 & 인터페이스

훈츠 2020. 2. 13. 17:57
반응형

안녕하세요. 훈츠 입니다. 이번 시간으로 클래스 편을 마무리 하려고 합니다. 지난시간에 소개해 드린 클래스1,2편을 참조하시고 이번편을 보시면 코딩 하시는데 도움이 될것 같습니다. 이번 시간에는 추상화 와 인터페이스 그리고 오버라이딩에 대해 이야기 해보겠습니다. 

오버라이딩 (overriding)

서브클래스 에서 슈퍼클래스에서 이미 구현된 함수를 재구현 해서 사용하는 것을 오버라이딩이라고 합니다. 

  • class에 상속 허용 처럼 function 에도 open을 붙이면 override가 가능합니다.
fun main() {
    var tiger = Tiger("호랭이",2)
    tiger.eat()
    var bear = Bear("곰탱이",1)
    bear.eat()
}

open class Animal (var name:String, var age:Int, var type:String)
{
    init {
        introduce()
    }
    open fun introduce(){
        println("안녕하세요.${type} 이름은 ${name} 이며, 나이는${age} 입니다.")
    }
    open fun eat() {
        println ("음식을 먹습니다. ")
    }
}

class Tiger(name:String,age:Int) : Animal(name,age,"호랑이"){
    override fun eat() {
        println ("음식은 고기를 먹습니다. ")
    }
}

class Bear(name:String,age:Int): Animal(name,age,"곰") {
    override fun eat() {
        println ("음식은 연어를 먹습니다. ")
    }
}
//출력 내용
안녕하세요.호랑이 이름은 호랭이 이며, 나이는2 입니다.
음식은 고기를 먹습니다. 
안녕하세요.곰 이름은 곰탱이 이며, 나이는1 입니다.
음식은 연어를 먹습니다. 

추상 함수 & 추상 클래스 abstract

추상 함수 및 추상클래스 를 만드는 방법은 abstract를 붙이면 됩니다. 추상함수 및 추상 클래스는 구현부는 없고 선언부만 있고 기능이 없는 것입니다. 추상클래스만 인스턴스 생성은 불가능 합니다. 

fun main() {
    var t = Tiger("호랭이",3)
    t.run()
    t.hunt()

}
//추상클래스 선언
abstract class Animal (var name:String, var age:Int, var type:String)
{
   abstract fun run() //추상함수 
    fun hunt(){
        println ("살금살금~ ")
    }
}
//추상클래스를 상속하고, 추상함수 override 하기 
class Tiger(name:String,age:Int) : Animal(name,age,"호랑이"){
    override fun run() {
        println("어흥어흥 달려가다")
    }
}

인터페이스 interface

코틀린에서 인터페이스는 속성 + 추상함수 + 일반함수로 구성 할수 있습니다. 하지만 추상클래스와 다르게 생성자를 가질수는 없습니다. 인터페이스에서는 구현부가 있으면 "open"키워드를 붙이지 않아도 open함수로 간주 하고, 구현부가 없는 함수는 "abstract"함수로 간주 합니다. 별도의 키워드를 붙이지 않아도 인터페이스를 상속한 서브클래스에서 구현 및 재정의가 가능 합니다. 추상 클래스와 다르게 여러 인터페이스를 상속 받을수도 있습니다. 

  • 인터페이스 = 속성 + 추상함수 + 일반함수
  • "open" 혹은 "abstract" 키워드 붙이지 않아도 구현부 유무에 따라 간주
  • 한번에 여러 인터페이스 상속 가능 
fun main() {
    var p = Person("hoons")
    p.computing()
    p.drink()
}

interface Playing {
    fun computing()
}

interface Drinking{
    fun drink(){
        println("물을 마십니다.")
    }
}

class Person(val name:String):Playing,Drinking{
    override fun computing() {
        println("컴퓨터를 합니다.")
    }

    override fun drink() {
        println("음료를 마십니다.")
        super.drink()
    }
}

//출력화면
컴퓨터를 합니다.
음료를 마십니다.
물을 마십니다.

 

반응형