Classes
kotlin에서 Class는 Java에서와 마찬가지로 ‘class’키워드를 사용합니다.
아래 코드와 같이 Class에 바디가 없을 경우 생략이 가능합니다. Java에서와 달리 이게 될까? 싶은게 됩니다.ㅎㅎ
class Person {
/*..*/
}
class Person
생성자(Constructor)
코틀린에서는 클래스의 Primary Constructor를 함수의 인자와 같이 Class의 헤더에 명시를 합니다.
생성자에 annotation, visibility modifiers가 없으면 constructor키워드를 생략할 수 있습니다.
class Person constructor(name: String){
/*..*/
}
class Person (name: String){
/*..*/
}
//constructor 키워드가 반드시 필요한 상황.
class Customer public @Inject constructor(name: String) { /*...*/ }
Primary Constructor에는 코드가 담길 수 없으며 코드를 쓰고 싶을 경우, class의 body에 init키워드를 사용해 작성합니다. 작성을 하면 class의 instance가 초기화되는 시점에 body에 쓰여진 순서대로 init 코드들이 실행됩니다.
class InitOrderDemo(name: String) {
val firstProperty = "First property: $name".also(::println)
init {
println("First initializer block that prints $name")
}
val secondProperty = "Second property: ${name.length}".also(::println)
init {
println("Second initializer block that prints ${name.length}")
}
}
Secondary Constructor를 Kotlin에서는 Constructor 키워드를 사용해 정의할 수 있습니다. 자바에서는 클래스명을 그대로 사용한 메소드를 만들어 정의하는 것과 차이가 있습니다.
class Person(val pets: MutableList<Pet> = mutableListOf())
class Pet {
constructor(owner: Person) {
owner.pets.add(this) // adds this pet to the list of its owner's pets
}
}
클래스의 인스턴스 생성
자바에서와 달리 코틀린에서는 new키워드를 사용하지 않습니다.
val invoice = Invoice()
val customer = Customer("Joe Smith")
추상 클래스(Abstract Class)
자바에서와 마찬가지로 abstract 키워드를 사용하여 추상 클래스를 구현하며 abstract 멤버가 하나라도 있으면 class는 abstract class입니다.
추상 클래스는 인스턴스화 할 수 없으며 상속 받은 클래스는 abstract 멤버를 구현하여야합니다.
abstract class Polygon {
abstract fun draw()
}
class Rectangle : Polygon() {
override fun draw() {
// draw the rectangle
println("rectangle")
}
}
open 함수 혹은 멤버를 abstract 함수 혹은 멤버로 재정의 할 수 있습니다.
코틀린에서 클래스는 기본적으로 final로 상속하거나 할 수 없으며 open키워드를 정의하면 상속이 가능해집니다.
다만 abstract와 다르게 open 클래스는 상속받는 대상이 없어도 인스턴스화가 가능하며 상속받은 대상은 open 멤버를 그대로 사용하여도 되고 재정의하여도 됩니다.
open class Polygon {
open fun draw() {
// some default polygon drawing method
}
}
abstract class WildShape : Polygon() {
// Classes that inherit WildShape need to provide their own
// draw method instead of using the default on Polygon
abstract override fun draw()
}