인프런에서 제공하고 있는 강의를 보고 정리한 글입니다.
추상 클래스
abstract class Animal (
protected val speciess: String,
protected val legCount: Int,
) {
abstract fun move()
}
class Cat(
species: String
) : Animal(species, 4) { // 한칸 띄고 : 를 붙여야함.
override fun move() {
println("Cat is moving")
}
}
extends키워드를 사용하지 않고:를 사용한다.- 상위 클래스의 생성자를 바로 호출한다.
override를 필수적으로 붙여주어야 한다.
abstract class Animal (
protected val speciess: String,
protected open val legCount: Int,
) {
abstract fun move()
}
class Penguin(
species: String
) : Animal(species, 2) { // 한칸 띄고 : 를 붙여야함.
private val wingCount: Int = 2
override fun move() {
println("Penguin is moving!:)
}
// getter 를 새로 정의하기 위한 override 키워드
override val legCount: Int
get() = super.legCount = this.wingCount
}
- property 를 override 할 때에는 반드시
open을 붙여주어야 한다. - 그래서 Animal 클래스의
legCount에open을 붙여주어야 한다. - Java 와 kotlin 모두 추상 인터페이스를 인스턴스화 시킬 수 없다.
인터페이스
interface Flayable {
fun act() {
println("파닥파닥")
}
}
interface Swimmable {
fun act() {
println("어푸어푸")
}
}
- Kotlin 에서는
default키워드 없이 메소드 구현이 가능하다.
class Penguin(
species: String
) : Animal(species, 2), Swimmable, Flyable {
override fun act() {
super<Swimmable>.act()
super<Flyable>.act()
}
}
중복되는 인터페이스를 특정할 때 super<타입>.함수 를 사용한다.
interface Swimmable {
val swimmablility : Int // 펭귄에서 custom getter 을 통해서 값을 넣을 수 있고
get() = 3 // 이렇게 기본 값 설정도 가능하다
fun act() {
println("어푸어푸")
}
}
Kotlin 에서는 backing field 가 없는 프로퍼티를 Interface 에 만들 수 있다.
클래스를 상속할 때 주의할 점
상위 클래스에 constructor 와 init 블락에서는 하위 클래스의 프로퍼티에 접근하면 안된다. 하위 클래스의 필드가 초기화 되기 전에 접근해버리기 때문이다. final 이 아닌 프로퍼티에 접근하면 안된다.
상위 클래스를 설계할 때, 생성자 또는 초기화 블록에 사용되는 프로퍼티에는 open 을 피해야 한다.
상속 관련 지시어 정리
- final : override 를 할 수 없게 한다. default 로 보이지 않게 존재한다.
- open : override 를 열어준다.
- abstract : 반드시 override 해야 한다.
- override : 상위 타입을 오버라이드 하고 있다.
정리
- 상속 또는 구현할 때
:를 사용한다. - 상위 클래스 상속을 구현할 때, 생성자를 반드시 호출해야 한다.
override를 필수로 붙여야 한다.- 추상 멤버가 아니면 기본적으로 오버라이드가 불가능 하다. open 을 사용해줘야 한다.
- 상위 클래스의 생성자 또는 초기화 블록에서 open 프로퍼티를 사용하면 얘기치 못한 버그가 생길 수 있다.
'[ Kotlin ]' 카테고리의 다른 글
| 코틀린에서 object 키워드를 다루는 방법 - 12강 (1) | 2024.08.28 |
|---|---|
| 코틀린에서 접근 제어를 다루는 방법 - 11강 (2) | 2024.08.28 |
| 코틀린에서 클래스를 다루는 방법 - 9강 (0) | 2024.08.23 |
| 코틀린에서 함수를 제어하는 방법 - 8강 (0) | 2024.08.23 |
| 코틀린에서 코드를 제어하는 방법 - 6강, 7강 (0) | 2024.08.23 |