kotlin 클래스의 상속, 오버라이딩, 오버로딩, 인터페이스

728x90

상속

kotlin은 기본적으로 클래스간의 상속이 금지되어있다.

상속을 하려면 이 기본값을 상속금지에서 상속가능으로 변경해주어야 한다. 변경해줄 때 클래스 앞에 open을 붙인다.

// open을 붙인다
open class Animal(var name:String, var age:Int, var type:String){
    fun introduce(){
        println("[$type] Hi my name is $name and I'm $age!")
    }
}
//상속을 받을 때 안의 매개변수는 상속을 받는 것이므로 var을 선언하지 않고 매개변수의 이름만 선언한다.
//선언을 할 때 사용할 기본값만 선언하고 상속을 받으면서 고정될 기본값을 다음 : 뒤에 붙인다.
class Dog(name:String, age:Int) : Animal(name, age, "Dog"){
//  자손만 사용할 수 있는 메서드도 역시 생성 가능하다
    fun bark(){
        println("bark bark!")
    }
}

fun main(){
    var sally = Animal("sally", 5, "Dog")
    sally.introduce()

    var sam = Dog("sam", 4)
//  상속을 받았기 때문에 부모의 메서드를 사용할 수 있다.
    sam.introduce()
//  자손만 사용할 수 있는 메서드도 역시 생성 가능하다
    sam.bark()
}

[Dog] Hi my name is sally and I'm 5!
[Dog] Hi my name is sam and I'm 4!
bark bark!

 

오버라이드

자바와는 다르게 오버라이딩, 즉 부모의 메서드를 자손의 메서드에서 사용이 불가능하다.

역시나 오버라이딩을 할 때도 위의 상속 개념과 같게 open을 앞에 붙여주게 된다면 자손의 객체에서도 동일한 이름의 메서드를 오버라이딩 할 수 있게 해준다.

open class Animal(var name:String, var age:Int, var type:String){
    fun introduce(){
        println("[$type] Hi my name is $name and I'm $age!")
    }
//  open을 붙여주어 오버라이딩이 가능하게 한다.
    open fun live(){
        println("We are wild animals")
    }
}
class Dog(name:String, age:Int) : Animal(name, age, "Dog"){
//  부모 객체의 메서드를 오버라이드, override를 붙여준다
    override fun live(){
        println("we are domestic animals")
    }
}

fun main(){
    var sam = Dog("sam", 4)
//  부모의 메서드 오버라이드.
    sam.live()
}

we are domestic animals

 

추상화, abstract

추상화, 즉 클래스와 그의 메서드를 구현하되 내용은 적지않고 이 추상화 클래스를 상속받는 클래스가 구현을 대신 한다. 부분적으로 구현을 할 수 있으나 전부 구현되지 않은 미완성 클래스라고 이해하자.

추상화로 구현할 때는 abstract를 클래스명 앞과 메서드명 앞에 붙인다.

abstract class cat(){
    abstract fun eat()
    fun jump(){
        println("Jump!")
    }
}

 

위의 만든 cat 추상화 클래스를 활용한다면 아래와 같이 활용할 수 있다.

// 추상화 클래스를 만든다. 전부 구현되지 않은 미완성 메서드 껍데기
abstract class cat(){
    abstract fun eat()
    fun jump(){
        println("Jump!")
    }
}
//추상화 클래스를 상속받아서 미완성된 메서드를 구현한다.
class DomesticCat : cat(){
    override fun eat(){
        println("eating fish")
    }
}
// 미완성 메서드를 실행한다.
fun main(){
    var cats = DomesticCat()
    cats.eat()
    cats.jump()
}


eating fish
Jump!

 

인터페이스

마지막으로 kotlin의 인터페이스에 대해 알아보자.

kotlin의 인터페이스는 생성자를 가질 수 없고 구현부가 있는 함수는 open함수, 구현부가 없는 함수는 abstract함수로 간주하기 때문에 재정의를 해줄 필요 없이 서브클래스(인터페이스를 받는 클래스)에서 override를 붙여 재선언이 가능하다.

아래 예시를 보면서 이해하자

//두개의 인터페이스를 만든다.
interface move{
    fun move(){
        println("move move")
    }
}
interface eat{
    fun eat()
}

//서브클래스인 Dog을 생성하고 두개의 인터페이스를 콤마를 통해 받는다.
//두개의 구현부를 구현한다.
class Dog(var name: String, var age:Int) : move, eat{
//  두개의 메서드를 override modifier를 통해 서브클래스에서 재정의하여 실행한다.
    override fun eat() {
        println("eat DogFood")
    }
    override fun move() {
        println("go for a walk!")
    }
}

// 구현된 메서드를 실행한다.
fun main(){
    var cats =  Dog("Sally", 3)
    cats.eat()
    cats.move()
}

eat DogFood
go for a walk!
728x90

'Kotlin > 문법' 카테고리의 다른 글

kotlin의 클래스 - 객체지향  (0) 2022.04.30
kotlin 반복문 while, for - step  (0) 2022.04.29
kotlin 조건 연산자 - when, if  (0) 2022.04.29
kotlin 함수 만들기, Any 사용하기  (0) 2022.04.29
kotlin 명시적 형변환, 배열  (0) 2022.04.29