File
Computed property
class Dice() {
val rolledValue
get() = (1..6).shuffled().first()
}
-
산출 속성computed property은 다른 속성이나 변수 등의 값을 사용해서 자신의 값을 산출하는 속성
-
값을 저장할 필요가 없으므로 코틀린 컴파일러가 후원 필드를 생성하지 않음
data class
-
데이터만 담기 위한 클래스
-
data class Player
와 같이data
키워드 사용 -
자동으로 몇가지 기능 지원
-
getter/setter
-
equals()
,hashCode()
,copy()
,toString()
,componentN()
-
-
좋은 data class의 조건
-
기본 생성자에 1개 이상의 파라미터
-
기본 생성자의 파라미터가 var, val로 생성
-
data class는 abstract, open, sealed, inner 클래스일 수 없음
-
sealed class
-
enum class를 확장한 개념을 가진 한정 클래스sealed class
Interface
-
인터페이스는 어떻게(how)가 아닌 무엇(what)을 구현해야 하는지를 명시하는 것
Creature.kt
interface Fightable {
var healthPoints: Int
val diceCount: Int
val diceSides: Int
val damageRoll: Int
fun attack(opponent: Fightable): Int // (1)
}
-
헤더만 선언하고 몸체의 구현코드가 없는 함수를 추상 함수(abstract function)라고 한다.
인터페이스 구현하기
class Player(
_name: String,
override val healthPoints: Int = 100, // (1)
val isBlessed: Boolean = false,
private val isImmortal: Boolean
) : Fightable { // (2)
// ...
}
-
오버라이드할 속성은
override
키워드를 사용한다. -
콜론(
:
)을 통해 구현한다.
Object
object CarFactory {
val cars = mutableListOf<Car>()
fun makeCar(horsepowers: Int): Car {
val car = Car(horsepowers)
cars.add(car)
return car
}
}
class Car(power: Int) {
}
-
코틀린에는 static이란 개념이 없음
-
object
키워드를 통해 싱글턴 지원(java의 static과 유사)
Companion object
class Car(val horsepowers: Int) {
companion object Factory {
val cars = mutableListOf<Car>()
fun makeCar(horsepowers: Int): Car {
val car = Car(horsepowers)
cars.add(car)
return car
}
}
}
fun main(args: Array<String>) {
val car = Car.makeCar(150)
val car2 = Car.Factory.makeCar(150)
println(Car.Factory.cars.size)
}
-
클래스 내에 하나만 생성 가능