Initializer Blocks
About
Java์์ ์์ฑ์๋ ์ฌ๋ฐ๋ฅธ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ์ญํ ์ ํ๋ค. ์์ฑ์์์ validation์ ์ ์ฉํ๊ธฐ๋ ํ๋ค.
์ฝํ๋ฆฐ์์๋ ์ด๋ฌํ validation ๋ก์ง์ init ๋ธ๋ก์์ ์ฒ๋ฆฌํ ์ ์๋ค. ์ฝํ๋ฆฐ์์ ์ฃผ์์ฑ์(primary constructor)์๋ ์ฝ๋๋ฅผ ๋ฃ์ ์ ์๊ธฐ ๋๋ฌธ์, ํ์ํ๋ค๋ฉด init ๋ธ๋ก์์ ์ด๊ธฐํ ๋ก์ง ์ฝ๋๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
init ๋ธ๋ก์ ์ด๋์ ๋ฃ๋์ง์ ๋ฐ๋ผ ์คํ ์์๊ฐ ๋ฌ๋ผ์ง๋ฉฐ, top-down์ผ๋ก ์์ฐจ์ ์ผ๋ก ์คํ๋๋ค.
class Car(_yearOfMake: Int, _color: String) {
val yearOfMake: Int
val color: String
init {
if (yearOfMake < 1886) {
throw IllegalArgumentException("yearOfMake cannot be greater than 1886")
}
}
}
๋ํ, init ๋ธ๋ก์ ์ฌ๋ฌ ๊ฐ ๊ฐ์ง ์ ์๋ค. ๊ทธ๋ฐ๋ฐ ๊ตณ์ด ์ด๋ ๊ฒ ์ฌ๋ฌ ๊ฐ๋ฅผ ๋ฃ์ด์ผ ํ ์ด์ ๊ฐ ์์๊น?
Multiple Initializer Blocks
Stack Overflow์ ๋์จ ์์ ๋ฅผ ์กฐ๊ธ ๋ณํํด๋ดค๋ค.
class MultiInitBlock(
_x: Int,
_y: Int,
) {
val x: Int = _x
init {
if (x <= 0) {
throw IllegalArgumentException("x must be greater than 0")
}
}
var y: Int = _y
init {
// Continue with initialization...
}
}
๋ต๋ณ์๋ ์ฃผ์์ฑ์์์๋ ๋ก์ง์ ๋ฃ์ ์ ์์ผ๋ฏ๋ก, ์ฌ๋ฌ ๊ฐ์ init ๋ธ๋ก์ ์ด์ฉํ๋ฉด ์ด๊ธฐํ ๋จ๊ณ์์ ํ๋กํผํฐ ๋ฑ์ ์์กด์ฑ์ ์ฒ๋ฆฌํ ์ ์๋ค๊ณ ํ๋ค. (ํนํ ํ๋กํผํฐ๊ฐ ์ฝ๊ธฐ ์ ์ฉ val
์ผ ๋)
ํ๋์ init ๋ธ๋ก์ผ๋ก๋ ์ถฉ๋ถํ ๊ฐ๋ฅํ์ง๋ง, ๊ทธ๋ ๊ฒ ํ๋ฉด ์ฝ๊ธฐ์ ์ฉ ํ๋กํผํฐ์ ์ ์ธ๊ณผ ์ด๊ธฐํ๋ฅผ ๋ถ๋ฆฌํ๊ฒ ๋๋ค๊ณ ํ๋ค. ๋ฐ๋ฉด, ์ฌ๋ฌ ๊ฐ์ init ๋ธ๋ก์ ์ด์ฉํ๋ฉด ์ ์ธ๊ณผ ์ด๊ธฐํ, ๊ทธ๋ฆฌ๊ณ ํ์ํ ๊ณ์ฐ์ ์ด๊ธฐํ์ ๋ฃ์ ์ ์์ด์ ์ฝ๋๊ฐ ๋ cleanํ๊ณ , ๊ฐ๋ ์ฑ์ด ๋์์ง๋ค๊ณ ํ๋ค.
๋ด๊ฐ ๋ณด๊ธฐ์๋ ๊ทธ๋ฅ ์ฌ๋ฌ ๊ฐ์ ๋ก์ง์ด ์๋๋ผ๋ ํ๋์ init ๋ธ๋ก์ ๋ฃ์ด๋ ๋ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํ๋ค. ์คํ๋ ค {}
๋ก ์ด๊ธฐํ ๋ถ๋ถ์ ๊ฐ์ธ๋ ๊ฒ๋ณด๋ค ๊ฐ๋
์ฑ์ด ์ฌ๋ผ๊ฐ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํ๋ค. (์ฌ์ค ์ฌ์ ํ ๊ฐ๋
์ฑ์ ํ๋์ init ๋ธ๋ก์ด ๋ ์ข๋ค๊ณ ์๊ฐํ๋ค.)
์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ง๋ง init ๋ธ๋ก์ ์ด๋ฐ ์์ผ๋ก ์ฌ๋ฌ ๊ฐ ๋ฌ ์๋ ์์ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋ค. ์์ฑ๊ณผ init ๋ธ๋ก์ด ์ค๊ฐ ์ค๊ฐ ์์ฌ ์์ด์ ๋ณด๊ธฐ์ ๊ทธ๋ ๊ฒ ์ข์๋ณด์ด์ง ์์ง๋ง ๋ง์ด๋ค.
๊ฐ๊ธ์ init ๋ธ๋ก์ 1๊ฐ๋ง ๋ง๋ค๊ณ , ๊ฐ๋ฅํ๋ค๋ฉด 1๊ฐ๋ ๋ง๋ค์ง ์๋ ๊ฒ์ด ์ข๋ค๊ณ ํ๋ค. ์์ฑ์์์ ์ต๋ํ ์๋ฌด๋ฐ ์์ ๋ ์ํ๋ ๊ฒ์ด ํ๋ก๊ทธ๋จ์ ์์ ์ฑ๊ณผ ํผํฌ๋จผ์ค ์ธก๋ฉด์์ ๋ชจ๋ ๋ ์ฅ์ ์ด ํฌ๋ค๊ณ ํ๋ค. <๋ค์ฌ๋ค๋ฅ ์ฝํ๋ฆฐ ํ๋ก๊ทธ๋๋ฐ>(์์ง๋ท์ปด, 2021)
REF
Last updated
Was this helpful?