Language/kotlin

상속 다루기

kimjingyu 2023. 5. 22. 12:18
728x90

추상 클래스

  • Animal이라는 추상클래스를 구현한 Cat, Penguin 클래스
  • extends 키워드를 사용하지 않고, : 을 사용한다.
  • 상위 클래스의 생성자를 바로 호출한다.
  • override를 필수적으로 붙여 주어야 한다.
abstract class Animal (
    protected val species: String,
    protected val legCount: Int
){
    abstract fun move()
}
class Cat (
    species: String
) : Animal(species, 4) {
    override fun move() {
        println("고양이가 사뿐 사뿐 걸어가~")
    }
}
  • 추상 프로퍼티가 아니라면 상속할 때 open을 꼭 붙여야 한다.
protected open val legCount: Int
  • 추상클래스에서 자동으로 만들어진 getter를 override 한다. (상속받을 때)
override val legCount: Int
    get() = super.legCount + this.wingCount
  • 자바, 코틀린 모두 추상 클래스는 인스턴스화 할 수 없다.

인터페이스

  • defalut 키워드 없이 메서드 구현이 가능하다.
  • 추상 메서드를 만들 수 있다.
  • 인터페이스 구현도 : 을 사용한다.
  • 중복되는 인터페이스를 특정할 때, super<타입>.함수 를 사용한다.
  • backing field가 없는 property를 interface에 만들 수 있다.
interface Flyable {
    fun act() {
        println("파닥 파닥")
    }
}
interface Swimable {
    fun act() {
        println("어푸 어푸")
    }
}
class Penguin (
    species: String
) : Animal(species, 2), Swimable, Flyable {
	
    override fun act() {
        super<Swimable>.act()
        super<Flyable>.act()
    }
}

 

클래스를 상속할 때 주의할 점

  • 상위 클래스를 설계할 때, 생성자 또는 초기화 블록에 사용되는 property에는 open을 피해야 한다.
open class Base (
    open val number: Int = 1
){
    init {
        println("Base Class")
        println(number)
    }
}
class Derived (
    override val number: Int
) : Base(number) {
    init {
        println("Derived Class")
    }
}
// 결과값
Base Class
0
Derived Class

상속 관련 지시어 정리

  • final: override를 할 수 없게 한다. default로 보이지 않게 존재한다.
  • open: override를 열어준다.
  • abstract: 반드시 override를 해야한다.
  • override: 상위 타입을 override 하고있다.

정리

  • 상속 또는 구현을 사용할 때는 : 을 사용해야 한다.
  • 상위 클래스 상속을 구현할 때, 생성자를 반드시 호출해야 한다.
  • override를 필수로 붙여야한다.
  • 추상 멤버가 아니면 기본적으로 override가 불가능하다.
    • open을 사용해주어야 한다.
  • 상위 클래스의 생성자 또는 초기화 블록에서 open 프로퍼티를 사용하면 예기치 못한 버그가 생길 수 있다.

 

728x90