1. 클래스와 프로퍼티
프로퍼티 = 필드 + getter + setter
코틀린에서는 필드만 만들면 getter, setter를 자동으로 만들어준다.
fun main() {
Person()
}
class Person(
val name: String,
val age: Int
) {
init {
if (age <= 0) {
throw IllegalArgumentException("나이는 ${age}일 수 없습니다.")
}
println("초기화 블록")
}
constructor(name: String): this(name, 1) {
println("첫 번째 부생성자")
}
constructor(): this("홍길동") {
println("두 번째 부생성자")
}
}
주 생성자는 class 클래스명(변수) 와 같이 작성하고, init에 초기화와 부 생성자(constructor)를 통해서 생성자 오버로딩이 가능합니다. 부 생성자에서는 꼭 주 생성자를 호출해주어야 합니다.
fun isAdult(): Boolean {
return this.age >= 20
}
val isAdult: Boolean
get() = this.age >= 20
val isAdult: Boolean
get() {
return this.age >= 20
}
isAdult는 성인인지 아닌지를 판별하는 함수 혹은 프로퍼티인데요
첫번째 함수처럼 함수로 생성해서 하는게 일반적이지만 프로퍼티로 생성해서 사용해도 괜찮습니다.
backing field는 자신을 가르키는 필드로 무한루프를 막기 위한 예약어 입니다. 예제를 살펴 보겠습니다.
val name String = name
get() = field.uppercase()
위 예제는 이름을 요청 받았을 때 알파벳 대문자로 만들어서 반환하게 됩니다. 저기서 field 부분이 이제 name을 대체합니다. 여기서 의문점은 field말고 그냥 name을 사용하면 되지 않냐 이겁니다. 하지만 name에서 getter를 호출하면 그안에 네임이 있고 그안에서 getter를 호출하고 그안에 name이 있는 무한 반복이 되기 때문에 backing field를 사용하게 됩니다
class Cat(
species: String
) : Animal(species, 4) {
override fun move() {
println("고양이가 사뿐 사뿐 걸어가~")
}
}
위 코드는 고양이가 animal이라는 부모 클래스를 상속 받고 있는 모습입니다.
상속 받을 시 주의사항
프로퍼티를 오버라이드 하기 위해서는 open을 붙여주어야 된다.
abstract class Animal(
protected val species: String,
protected open val legCount: Int
) {
abstract fun move()
}
fun main() {
moveSomething(object : Movable {
override fun move() {
println("움직인다")
}
override fun fly() {
println("난다~~")
}
})
권장하지 않는 타입의 예제
class House(
var address: String,
) {
var livingRoom = this.LivingRoom(10.0)
inner class LivingRoom(
private var area: Double,
) {
val address: String
get() = this@House.address
}
}