Kotlin의 Class
1. Class와 Property
class Person1 constructor(name: String, age: Int) {
val name: String = name
var age: Int = age
}
// 위의 Class는 아래 Class로 변경할 수 있다.
class Person2(
val name: String,
var age: Int
) {
}
2. 생성자와 init
init 블록은 클래스가 초기화되는 시점에 한 번 호출되기에
클래스가 생성되는 시점에 무언갈 검증하고 싶을 때 init을 활용하면 된다.
또한 생성자를 추가하고 싶으면 constructor를 아래 추가한 뒤에 사용하면 된다.
하지만 부 생성자보다는 default parameter를 추천한다.
class Person(
val name: String,
var age: Int // 주 생성자
) {
init {
if(age <= 0) {
throw IllegalArgumentException("나이는 ${age}일 수 없습니다.")
}
}
constructor(name: String) : this(name, 1) // 부 생성자
}
3. 커스텀 getter, setter
getter와 setter를 커스텀 할 수 있다.
아래의 두 프로퍼티는 getter인데 같은 코드이다.
val isAdult: Boolean
get() = this.age >= 20
val isAdult: Boolean
get() {
return this.age >= 20
}
Kotlin에서 상속을 다루는 법
1. 추상클래스
추상 클래스를 만들 때에는 Java와 동일하게 Class 앞에 abstract를 붙여야한다.
또한 상속을 받을 때에는 한 칸 띄고 : 뒤 부모 클래스를 상속 받으면 된다.
Animal 클래스가 추상 클래스이다.
여기서 추상 프로퍼티가 아니라면 상속을 받을 때 무조건 open을 붙여줘야 한다.
abstract class Animal(
protected val species: String,
protected open val legCount: Int
) {
abstract fun move();
}
class Cat(
species: String
) : Animal(species, 4) {
override fun move() {
println("고양이가 사뿐 사뿐 걸어가~")
}
}
2. 인터페이스
인터페이스 구현도 똑같이 :을 사용한다.
인터페이스는 default 메소드를 구현할 때 default 없이 메소드 구현을 할 수 있다.
또한 중복되는 인터페이스를 특정할 때에는 super<타입> 으로 한다.
class Penguin(
species: String
) : Animal(species, 2), Swimable, Flyable {
private val wingCount: Int = 2
override fun move() {
println("펭귄이 움직입니다~ 뒤뚱 뒤뚱~")
}
override val legCount: Int
get() = super.legCount + wingCount
override fun act() {
super<Swimable>.act()
super<Flyable>.act()
}
override val swimAbility: Int
get() = 3
}
3. 상속 받을 시 주의할 점
상속 시 주의할 점은 상위 클래스의 constructor와 init 블록에서는
하위 클래스의 field에 접근하면 안된다. (final 제외)
하위 클래스 호출 시 상위 클래스가 먼저 호출되어 하위 클래스의 프로퍼티가 초기화 되지 않아 오류가 발생한다.