Documents

type

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)
}
1 헤더만 선언하고 몸체의 구현코드가 없는 함수를 추상 함수(abstract function)라고 한다.
인터페이스 구현하기
class Player(
  _name: String,
  override val healthPoints: Int = 100, (1)
  val isBlessed: Boolean = false,
  private val isImmortal: Boolean
) : Fightable { (2)
  // ...
}
1 오버라이드할 속성은 override 키워드를 사용한다.
2 콜론(:)을 통해 구현한다.

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