Kotlin constructor ์ ๋ฆฌ
Kotlin์ ํด๋์ค๋ ํ๋์ Primary constructor(์ฃผ ์์ฑ์)์ ํ๋ ์ด์์ Secondary constructor(๋ถ ์์ฑ์)๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
Primary constructor
Primary constructor๋ ํด๋์ค ์ด๋ฆ ๋ค์ ํ๊ธฐํฉ๋๋ค.
class Person constructor(firstName: String) { /*...*/ }
Primary constructor์ ์ด๋
ธํ
์ด์
์ด๋ ์ ๊ทผ ์ ํ์(visibility modifiers)๊ฐ ์๋ ๊ฒฝ์ฐ, constructor
ํค์๋๋ ์๋ต ๊ฐ๋ฅํฉ๋๋ค.
class Person(firstName: String) { /*...*/ }
Primary constructor๋ ์ฝ๋ ๋ธ๋ญ์ ๊ฐ์ง ์ ์์ผ๋ฏ๋ก, ์ด๊ธฐํ ์ฝ๋๋ init
๋ธ๋ญ ์์ ์์ฑํฉ๋๋ค.
class Person(firstName: String) {
private val nameLength = firstName.length
init {
println("Second initializer block that prints $nameLength")
}
}
ํ๋กํผํฐ ์ด๊ธฐํ์ 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}")
}
}
> ์คํ ๊ฒฐ๊ณผ
First property: hello
First initializer block that prints hello
Second property: 5
Second initializer block that prints 5
Primary constructor์ ํ๋ผ๋ฏธํฐ๋ ํ๋กํผํฐ ์ด๊ธฐํ์ init ๋ธ๋ญ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
class Customer(name: String) {
val customerKey = name.toUpperCase()
}
์๋์ ๊ฐ์ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด, Primary constructor ์์์ ํ๋กํผํฐ ์ ์ธ๊ณผ ์ด๊ธฐํ๋ฅผ ํ๋ฒ์ ํ ์๋ ์์ต๋๋ค. Primary constructor ํ๋ผ๋ฏธํฐ๋ฅผ var
๋๋ val
๋ก ์ ์ธํฉ๋๋ค.
class Person(val firstName: String, val lastName: String, var age: Int) { /*...*/ }
์์ฑ์์ ์ด๋
ธํ
์ด์
์ด๋ ์ ๊ทผ ์ ํ์๋ฅผ ๋ถ์ฌ์ผ ํ๋ค๋ฉด constructor
ํค์๋๋ฅผ ๊ผญ ๋ถ์ฌ์ค์ผ ํฉ๋๋ค.
class Customer public @Inject constructor(name: String) { /*...*/ }
Secondary constructor
constructor
ํค์๋๋ก Secondary constructor๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค.
class Person {
var children: MutableList<Person> = mutableListOf<Person>();
constructor(parent: Person) {
parent.children.add(this)
}
}
ํด๋์ค์ Primary constructor๋ ์๋ค๋ฉด, Secondary constructor์์ Primary constructor๋ก ์ง์ ์์ ๋๋ ๋ค๋ฅธ Secondary constructor๋ฅผ ํตํ ๊ฐ์ ์์์ด ํ์ํฉ๋๋ค. ๊ฐ์ ํด๋์ค ์์ ์๋ ๋ค๋ฅธ ์์ฑ์๋ก์ ์์์ this
ํค์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
class Person(val name: String) {
var children: MutableList<Person> = mutableListOf<Person>();
constructor(name: String, parent: Person) : this(name) {
parent.children.add(this)
}
}
์ด๊ธฐํ ์ฝ๋๋ Primary constructor์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋๊ธฐ ๋๋ฌธ์, Secondary constructor ์คํ ์ด์ ์ ํ๋กํผํฐ ์ด๊ธฐํ ์ฝ๋์ init ๋ธ๋ญ์ด ๋จผ์ ์คํ๋ฉ๋๋ค. Primary constructor๊ฐ ์๋๋ผ๋ ์์์ ์ผ๋ก ์์๋๊ธฐ ๋๋ฌธ์ ์ด๊ธฐํ ๋ธ๋ญ์ด Secondary constructor๋ณด๋ค ํญ์ ๋จผ์ ์คํ๋ฉ๋๋ค.
class Constructors {
init {
println("Init block")
}
constructor(i: Int) {
println("Constructor")
}
}
> ์คํ ๊ฒฐ๊ณผ
Init block
Constructor
์ถ์ ํด๋์ค๊ฐ ์๋ ํด๋์ค๋ ๋ณ๋๋ก ์์ฑ์ ์ ์ธ์ ํ์ง ์์ผ๋ฉด, ์ธ์๊ฐ ์๋ public, primary constructor๋ฅผ ๊ฐ์ต๋๋ค. ๋ง์ฝ public ์์ฑ์๋ฅผ ๊ฐ์ง๋ฉด ์ ๋๋ ๊ฒฝ์ฐ, ๋น private constructor๋ฅผ ์ ์ธํด์ค์ผ ํฉ๋๋ค.
class DontCreateMe private constructor () { /*...*/ }
NOTE: Primary constructor์ ๋ชจ๋ ํ๋ผ๋ฏธํฐ๊ฐ ๋ํดํธ ๊ฐ์ ๊ฐ๋ ๊ฒฝ์ฐ, JVM ์ปดํ์ผ๋ฌ๊ฐ ํ๋ผ๋ฏธํฐ๊ฐ ์๋ ์์ฑ์๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๋น ์์ฑ์์์๋ ์ ์ธ๋ ๋ํดํธ ๊ฐ์ผ๋ก ๋ค๋ฅธ ์์ฑ์๋ฅผ ํธ์ถํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋น ์์ฑ์๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ Jackson์ด๋ JPA๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ Kotlin์์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
References
Comments