class
코틀린에서 class를 선언할 때는 자바와 마찬가지로 class라는 키워드로 선언한다.
class Invoice(data: Int){
}
헤더와 바디는 옵션이다. 바디가 없다면 { }도 생략 가능하다.
기본 생성자
자바와는 달리 생성자가 여러 개로 나뉜다.
우선 기본 생성자는 클래스별로 없거나 단 하나만 존재한다.
class Person constructor(firstName: String){
}
어노테이션이나 접근 지정자가 없을 때는 기본 생성자의 construcor 키워드를 생략할 수 있다.
기본 생성자는 코드를 가질 수 있다. 초기화는 init 블록 안에서 작성해야 한다.
class Customer(name: String){
init{
println("Customer initalized with value) ${name}")
}
}
기본생성자는 코드를 가질 수 없다는 것을 유의해야 한다.
또한 기본 생성자의 파라미터는 프로퍼티 초기화 선언에도 사용 가능하다.
class Customer(name: String){
init{
println("Customer initalized with value) ${name}")
}
val customerKey = name.toUpperCase()
}
이 뿐만 아니라 프로퍼티 선언 및 초기화는 기본 생성자에서 간결하게도 가능하다.
class Person(val firstName: String, val lastName: String){
}
보조 생성자
클래스 별로 여러 개를 가질 수 있다. constructor 키워드로 선언한다.
기본 생성자는 클래스의 헤더에 선언을 하지만 보조 생성자는 바디에 선언한다.
class Person(val firstName: String, val lastName: String){
constructor(parent: Person){
parent.children.add(this)
}
}
만약 클래스가 기본 생성자를 가지고 있다면, 각각의 보조 생성자들은 기본 생성자를 직접 혹은 간접적으로 위임해 주어야 한다. 직접적으로 위임하는 경우는 보조 생성자에서 바로 기본생성자에 위임하는 경우이고 간접적으로 위임하는 경우는 다른 보조생성자에 위임한다.
class Person(val name: String) {
//직접
constructor(name: String, parent: Person) : this(name) {
// parent.children.add(this)
}
//간접
constructor() : this("홍길동",Person()) {
}
}
만약 클래스에서 기본 생성자나 보조 생성자를 하나도 선언하지 않는다면 생성된 기본 생성자가 생성된다.
매개변수가 없고 가시성이 public이다. 만약 public이 아니어야 한다면 무조건 다른 기본 생성자를 선언해야 한다.
class DontCreate private constructor() {
}
인스턴스 생성
new 키워드를 사용하는 것이 아니라 생성자를 함수처럼 호출해서 사용하면 된다.
val invoice = Invocie()
클래스의 멤버
클래스 바디에 올 수 있는 것들은 정해져 있다.
- 보조 생성자, init블록
- 함수
- 프로퍼티
- 중첩 혹은 inner class
- object 선언