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