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)
}- 
클래스 내에 하나만 생성 가능