Kotlin : 상속

정종욱·2023년 7월 5일
0

Kotlin

목록 보기
10/16
post-thumbnail

추상클래스

class Cat(
	species: String
) : Animal(species, 4) {
	override fun move() {
    	...
    }
}

Animal 이라는 추상클래스를 Cat 이라는 클래스에 상속하는 방법이다.

  • extends 키워드를 사용않고 : 를 사용
  • 상위 클래스의 생성자를 바로 호출
  • override 어노테이션이 아닌 fun 앞에 override 를 붙임
class Penguin(
	species: String
) : Animal(species, 2) {
	private val wingCount: Int = 2

override val legCount: Int
	get() = super.legCount + this.wingCount
    
}

위 상황에서 super.field 와 같이 상속받은 클래스의 필드를 호출할 때 해당 필드에 open 이 붙어있지 않으면 에러가 발생한다.

👏 TIP : 자바와 코틀린 모두 추상 클래스는 인스턴스화 불가!

인터페이스

class Penguin(
	species: String
) : Animal(species, 2), Swimable, Flyable {
	override fun act() {
    	super<Swimable>.act()
        supse<Flyable>.act()
    }
}

Swimable, Flyable 이라는 interface가 존재

  • implement 없이 extends 와 동일하게 정의가능
  • 중복되는 인터페이스를 특정할땐 super<Type>.함수() 사용
interface Swimable {
	val swimAbility: Int
}

코틀린에는 위와 같이 backing field 가 없는 프로퍼티를 Interface 에 만들 수 있다.

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

fun main() {
	Derived(300)
}

open class Base(
	open val number: Int = 100
) {
	init {
    	println("Base Class")
        println(number)
    }
}

class Derived(
	override val number: Int
) : Base(number) {
	init {
    	println("Derived")
    }
}

main() 메서드 실행의 결과 값은 어떻게될까?
동작 순서는 이러하다

  • 상위 클래스 생성자가 실행
  • 상위 클래스에서 넘버를 호출
  • 하위 클래스의 number 를 가져오게 됨

하지만 하위 클래스에 number 라는 값이 초기화가 이루어지지 않아 100, 300도 아닌 0이라는 값을 표기하게된다.
그러므로 상위 클래스를 설계할 때 생성자 또는 초기화 블록에 사용되는 프로퍼티에는 open 을 피해야 한다.

👍 간략정리
final : override 할 수 없게 한다. default 로 보이지 않게 한다.
open : override 를 허용한다.
abstract : 반드시 override 해야한다.
override : 상위 타입을 오버라이드 하고있다.

0개의 댓글

관련 채용 정보