코틀린의 클래스는 3가지 구성 요소가 있다.
- class name : 클래스 이름
- class header : type parameter, primary constructor
- class body : 클래스의 프로퍼티나 함수 등을 정의하는 몸체
3가지 구성요소 중 클래스 이름만 있어도 선언이 가능하다. 이때 몸체의 경우 { } 로 감싸진 부분을 의미하므로 클래스의 몸체가 없으면 괄호도 필요 없다는 것이 특징적이다. 대략 이런게 가능하다.
class Something // 몸체 없이 클래스 생성 가능
Constructor
생성자는 2가지가 존재한다.
- Primary Constructor : 클래스 헤더에 위치하는 생성자. init 함수를 통해 값을 초기화한다.
- Secondary Constructor : 클래스 바디 안에 위치하는 생성자. 다른 언어의 생성자는 보통 이렇게 생겼다.
Primary Constructor
클래스 헤더에서 선언할 수 있는 생성자로, 클래스 당 하나만 가질 수 있다.
class Animal constructor(name: String, type: String)
// constructor은 특별한 지시자가 없으면 생략 가능
class Animal(name: String, type: String)
{
val name : String
val type : String
var age : Int = -1
// 프로퍼티 초기화는 클래스 몸체의 init 블럭에서 수행
init {
this.name = name
this.type = type
}
}
- constructor 키워드는 가시성 수정자 ( public , private 등 ) 를 붙일 필요가 없으면 생략 가능하다.
- init 블럭 내에서는 프로퍼티의 초기화(initialization)를 진행한다.
값을 "변경" 하는 것으로 취급하지 않으므로, 여기 안에서만 상수 프로퍼티의 값을 지정할 수 있다.
init 함수를 따로 두지 않고 파라미터 선에서 바로 프로퍼티를 초기화하는 기능도 있다.
class Animal(val name: String, val type: String) // 여기서 바로 초기화해서 사용
{
var age : Int = -1
}
Secondary Constructor
클래스 바디 안에 위치하는 생성자. 순서 상 각종 초기화 및 primary constructor이 실행된 이후에야 실행될 수 있다.
open class Animal constructor(name: String, type: String) {
val name : String
val type : String
var age : Int = -1
init {
this.name = name
this.type = type
}
constructor(name:String, type:String, age: Int) : this(name, type) {
this.age = age
println("2. age is ${this.age}")
// secondary constructor 이전에 반드시 primary constructor 이 실행된다.
// 여기서 변경되는 값은 상수 불가.
}
}
- primary constructor 및 이니셜라이저에 의한 초기화가 발생한 이후 실행된다.
- this 키워드를 통해 다른 생성자에게 위임(delagation) 하는 방식으로 작동한다.
- 상수의 초기화는 안되는 것으로 보이며, 초기화 자체는 이니셜라이저 또는 init 블럭 내부에서 처리되어야 한다.
'코틀린' 카테고리의 다른 글
[코틀린] 자바&코틀린 라이브러리 검색 (0) | 2022.11.05 |
---|---|
[Kotlin] 상속 (0) | 2022.10.10 |
[Kotlin] control flow (0) | 2022.09.06 |
[Kotlin] 기본 타입 (0) | 2022.09.03 |
[Kotlin] 기본 타입과 내부 처리 (0) | 2022.09.01 |