[Kotlin] init λΈλ‘
μΆμ²
https://kotlinlang.org/docs/classes.html#constructors
Classes | Kotlin
kotlinlang.org
https://kotlinlang.org/docs/inheritance.html#derived-class-initialization-order
Inheritance | Kotlin
kotlinlang.org
ν΄λμ€μ μ΄κΈ°ν
κΈ°λ³Έ μμ±μλ ν΄λμ€ ν€λ(ν΄λμ€μ μ΄λ¦κ³Ό μ£Όμμ±μ)μμ ν΄λμ€ μΈμ€ν΄μ€μ ν΄λΉ μμ±μ μ΄κΈ°ννλ€. κ°μ²΄ μμ± μ€μ μ½λλ₯Ό μ€ννλ €λ©΄ ν΄λμ€ λ³Έλ¬Έ λ΄λΆμ μ΄κΈ°ν λΈλ‘μ μ¬μ©νλ€. μ΄κΈ°ν λΈλ‘μ 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}")
}
}
fun main() {
InitOrderDemo("hello")
}
// (μΆλ ₯ κ²°κ³Ό)
// First property: hello
// First initializer block that prints hello
// Second property: 5
// Second initializer block that prints 5
λΆ μμ±μ
ν΄λμ€λ 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
}
}
ν΄λμ€μ κΈ°λ³Έ μμ±μκ° μλ κ²½μ°, κ° λ³΄μ‘° μμ±μλ κΈ°λ³Έ μμ±μμκ² μ§μ μμνκ±°λ, λ€λ₯Έ 보쑰 μμ±μλ€λ‘ κ°μ μ μΌλ‘ μμ±μ μμν μ μλ€. λ€λ₯Έ μμ±μμκ² μμν λ this ν€μλλ₯Ό μ¬μ©νλ€.
class Person(val name: String) {
val children: MutableList<Person> = mutableListOf()
constructor(name: String, parent: Person) : this(name) {
parent.children.add(this)
}
}
μ΄κΈ°ν μ½λλ κΈ°λ³Έ μμ±μμ μΌλΆκ° λλ€. κΈ°λ³Έ μμ±μμ μμνλ κ²μ΄ λΆ μμ±μμ 첫째 λ¬Έμμ μ κ·Όνλ λμ μΌμ΄λμ , λΆ μμ±μμ μ½λ λΈλ‘μ λͺ¨λ init λΈλ‘κ³Ό μμ±μ μ΄κΈ°νκ° λ€ μ€νλ νμ μ€νλλ€.
ν΄λμ€μ κΈ°λ³Έ μμ±μκ° μλλΌλ, μμμ μ묡μ μΌλ‘ λ°μν΄μ μ΄κΈ°ν λΈλ‘μ΄ κ³μ μ€νλλ€.
class Constructors {
init {
println("Init block")
}
constructor(i: Int) {
println("Constructor $i")
}
}
// (μΆλ ₯ κ²°κ³Ό)
// Init block
// Constructor 1
ν΄λμ€ μμμ κ²½μ° init λΈλ‘μ μ€ν
μμ ν΄λμ€κ° μ μΈμ€ν΄μ€λ₯Ό μμνλ λμ λΆλͺ¨ ν΄λμ€μ μ΄κΈ°νκ° λ§¨ λ¨Όμ μνλλ€. κ·Έ νμ μμ ν΄λμ€μ μ΄κΈ°νκ° μ§νλλ€.
open class Base(val name: String) {
init { println("Initializing a base class") }
open val size: Int =
name.length.also { println("Initializing size in the base class: $it") }
}
class Derived(
name: String,
val lastName: String,
) : Base(name.replaceFirstChar { it.uppercase() }.also { println("Argument for the base class: $it") }) {
init { println("Initializing a derived class") }
override val size: Int =
(super.size + lastName.length).also { println("Initializing size in the derived class: $it") }
}
fun main() {
println("Constructing the derived class(\"hello\", \"world\")")
Derived("hello", "world")
}
// (μΆλ ₯ κ²°κ³Ό)
// Constructing the derived class("hello", "world")
// Argument for the base class: Hello
// Initializing a base class
// Initializing size in the base class: 5
// Initializing a derived class
// Initializing size in the derived class: 10
λΆλͺ¨ ν΄λμ€κ° μμ±μκ° μ€νλ λ, μμ ν΄λμ€μμ μ μΈλκ±°λ μ€λ²λΌμ΄λλ νλ‘νΌν°λ μμ§ μ΄κΈ°νλμ§ μμ μνμ΄λ€. λΆλͺ¨ ν΄λμ€ μ΄κΈ°νμμ μμ§ μ΄κΈ°νλμ§ μμ μμ ν΄λμ€μ νλ‘νΌν°λ€μ μ¬μ©νλ©΄ μλͺ»λ λμμ΄λ λ°ν°μ μ€λ₯κ° λ°μν μ μλ€. κ·Έλμ λΆλͺ¨ ν΄λμ€λ₯Ό μ€κ³ν λμλ μμ±μμ open νλ‘νΌν°, νλ‘νΌν° μ΄κΈ°ν μμ , init λΈλ‘μ μ¬μ©νμ§ μλλ‘ νΌν΄μΌ νλ€.
ν΄λμ€ λΆ μμ±μμ init λΈλ‘ μ€ν μμ νμΈνκΈ°
1. μ£Ό μμ±μλ‘ κ°μ²΄λ₯Ό μμ±νκΈ°. ν΄λμ€ μμ μ¬λ¬ init λΈλ‘μ΄ μλ κ²½μ°
class Person(val name: String, val age: Int){ // -> νΈμΆ. μ£Ό μμ±μλ‘ κ°μ²΄ μμ±
init { // -> μ€ν 1
println("primary constructor : $name, $age")
}
constructor() : this(name= "none", age= 0) {
println("secondary constructor $name, $age")
}
constructor(message: String) : this() {
println("secondary constructor 2 : $name, $age")
}
init { // -> μ€ν 2
println("primary constructor 2 : $name, $age")
}
}
fun main() {
Person("Alice", 29)
}
// (μΆλ ₯ κ²°κ³Ό)
// primary constructor : Alice, 29
// primary constructor 2 : Alice, 29
- ν΄λμ€ λ΄λΆμ μμμλΆν° μλ μμλ‘ μ μΈλ init λΈλ‘μ μ€ννλ€.
2. λΆ μμ±μλ‘ κ°μ²΄λ₯Ό μμ±νλλ°, κ°μ²΄ μμ±μ μ£Ό μμ±μμ μμνλ€. νΈμΆνλ λΆμμ±μλ μ½λ λΈλ‘μΌλ‘ λΆ μμ±μμ init λΈλ‘μ μ μΈνλ€.
class Person(val name: String, val age: Int){
init { // -> μ€ν 1
println("primary constructor : $name, $age")
}
constructor() : this(name= "none", age= 0) { // -> νΈμΆ. μ£Ό μμ±μμκ² κ°μ²΄ μμ± μμ
println("secondary constructor $name, $age") // -> μ€ν 3
}
constructor(message: String) : this() {
println("secondary constructor 2 : $name, $age")
}
init { // -> μ€ν 2
println("primary constructor 2 : $name, $age")
}
}
fun main() {
Person()
}
// (μΆλ ₯ κ²°κ³Ό)
// primary constructor : none, 0
// primary constructor 2 : none, 0
// secondary constructor none, 0
- λ¨Όμ μ£Ό μμ±μλ‘ νΈμΆνλ κ°μ²΄ μ΄κΈ°ν 루νΈλ₯Ό νλ€. ν΄λμ€μ μμμ μλλ‘λΆν° μ μΈλ init λΈλ‘μ μ€ννλ€.
- κ·Έ λ€μ νΈμΆν λΆ μμ±μμ μ½λ λΈλ‘μ μ€ννλ€.
2. λΆ μμ±μλ‘ κ°μ²΄λ₯Ό μμ±νλλ°, κ°μ²΄ μμ±μ λ€λ₯Έ λΆ μμ±μμ μμνλ€. νΈμΆνλ λΆμμ±μλ μ½λ λΈλ‘μΌλ‘ λΆ μμ±μμ init λΈλ‘μ μ μΈνλ€.
class Person(val name: String, val age: Int){
init { // -> μ€ν 1
println("primary constructor : $name, $age")
}
constructor() : this(name= "none", age= 0) {
println("secondary constructor $name, $age") // -> μ€ν 3
}
constructor(message: String) : this() { // -> νΈμΆ. λ€λ₯Έ λΆ μμ±μμκ² κ°μ²΄ μμ± μμ
println("secondary constructor 2 : $name, $age") // -> μ€ν 4
}
init { // -> μ€ν 2
println("primary constructor 2 : $name, $age")
}
}
fun main() {
Person("Hello World")
}
// (μΆλ ₯ κ²°κ³Ό)
// primary constructor : none, 0
// primary constructor 2 : none, 0
// secondary constructor none, 0
// secondary constructor 2 : none, 0
- λ¨Όμ μ£Ό μμ±μλ‘ νΈμΆνλ κ°μ²΄ μ΄κΈ°ν 루νΈλ₯Ό νλ€. ν΄λμ€μ μμμ μλλ‘λΆν° μ μΈλ init λΈλ‘μ μ€ννλ€.
- κ·Έ λ€μ κ°μ²΄ μμ±μ μμν λΆ μμ±μμ μ½λ λΈλ‘μ μ€ννλ€.
- λ§μ§λ§μΌλ‘ νΈμΆν λΆ μμ±μμ μ½λ λΈλ‘μ μ€ννλ€.