10
10

์ธํ„ฐํŽ˜์ด์Šค ํ™•์žฅ

์ฝ”ํ‹€๋ฆฐ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ public์ด๊ณ  final์ด๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ๋Š” interface ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ถ”์ƒ๋ฉ”์„œ๋“œ, ๊ตฌํ˜„์ด ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ํด๋ž˜์Šค ์ƒ์†๊ณผ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ๋ชจ๋‘ :๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ›๋Š”๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฑด ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ํด๋ž˜์Šค ์ƒ์†์€ ํ•œ๊ฐœ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด์ ์€ ์ž๋ฐ”์™€ ๊ฐ™๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์— ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” override๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

class Button : Clickable, Focusable {
    override fun showOff() {
        super<Clickable>.showOff()
        super<Focusable>.showOff()
    }
}
 

Clickable๊ณผ Focausable ๋ชจ๋‘ showOff๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ–๊ณ ์žˆ๊ณ , ๊ตฌํ˜„์ชฝ์—์„œ๋Š” super<interface>๋ฅผ ํ†ตํ•ด ์–ด๋Š ์ชฝ์˜ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•  ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—๋„ ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ถ”์ƒ ํ”„๋กœํผํ‹ฐ์ด๋ฏ€๋กœ override๋กœ ๊ตฌํ˜„ํ•ด์ค˜์•ผํ•œ๋‹ค. ์ƒํƒœ ์ €์žฅ์ด ํ•„์š”ํ•˜๋ฉด ์ปค์Šคํ…€ ๊ฒŒํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์„ค์ •ํ•œ๋‹ค. ์ถ”์ƒ ํ”„๋กœํผํ‹ฐ๋Š” ์ƒํƒœ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— backing field๊ฐ€ ์—†์–ด์„œ getter, setter์— ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.

interface User {
    val email: String
    val nickname: String
        get() = email.substringBefore('@')
}
 

์ถ”์ƒ ํ”„๋กœํผํ‹ฐ์— ์ปค์Šคํ…€ ๊ฒŒํ„ฐ๋ฅผ ์„ค์ •ํ•œ ๋ชจ์Šต์ด๋‹ค. ์ด๋•Œ email์—๋Š” ๋ฌด์กฐ๊ฑด ์˜ค๋ฒ„๋ผ์ด๋“œํ•ด์•ผํ•˜๊ณ  nickname์€ ๊ทธ๋ƒฅ ์ƒ์† ๊ฐ€๋Šฅํ•˜๋‹ค.

backing field๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊น€์— ์ปค์Šคํ…€ ์„ธํ„ฐ๋„ ๊ฐ™์ด ๋ณด์ž.

class User(val name: String) {
    var address: String = "unspecified"
        set(value: String) {
            println("""
                Address was changed for $name:
                "$field" -> "$value".""".trimIndent())
            field = value
        }
}
 

setter์—์„œ๋Š” backing field๊ฐ’์— field๋ผ๋Š” ํ‚ค์›Œ๋“œ๋กœ ์ ‘๊ทผํ•  ์ˆ˜์žˆ๋‹ค. ๊ฒŒํ„ฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค.

getter, setter์˜ ๊ฐ€์‹œ์„ฑ์€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋”ฐ๋ผ๊ฐ€์ง€๋งŒ, ๋”ฐ๋กœ ๊ฐ€์‹œ์„ฑ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.

var counter: Int = 0
        private set
 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์—์„œ๋Š” setter์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ฒŒ๋œ๋‹ค.

open, final, abstract

์œ„ ํ‚ค์›Œ๋“œ๋Š” ์ƒ์†๊ด€๊ณ„๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์ƒ์œ„ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ํ•˜์œ„ํด๋ž˜์Šค๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๋™์ž‘์„ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ธ ์ทจ์•ฝํ•œ ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋Š”๋ฐ, ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ์ƒ์†์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ๋”ฐ๋กœ ๋ณ€๊ฒฝ์ž๋ฅผ ์ง€์ •ํ•˜๊ฒŒํ•˜๊ณ  ๊ธฐ๋ณธ์€ final๋กœ ํ•ด๋‘์–ด์„œ ์ƒ์†์„ ์œ„ํ•œ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์ƒ์†์„ ํ—ˆ์šฉํ•˜๋ ค๋ฉด open ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋ฉด ๋œ๋‹ค.

open class RichButton : Clickable {
    fun disable() {}
    open fun animate() {}
    override fun click() {}
}

class test: RichButton() {
    override fun animate() {
        super.animate()
    }
    override fun click() {
        super.click()
    }
}
 

๋ณด๋ฉด open ํด๋ž˜์Šค์˜ open, override๋กœ ์ง€์ •๋œ ๋ฉ”์„œ๋“œ๋Š” overrideํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๊ฒŒ ์•„๋‹Œ ํ•จ์ˆ˜๋Š” overrideํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋•Œ RichButton์˜ click์€ Clickable์˜ click์ด๋‹ค. override๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ open์ด๊ธฐ์— ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ ์„ ์ˆ˜ ์žˆ๋‹ค. overrideํ•˜๋Š” ํ•จ์ˆ˜์˜ ์ƒ์†์„ ๋ง‰์œผ๋ ค๋ฉด final override๋กœ ์„ ์–ธํ•˜๋ฉด๋œ๋‹ค. final ํ‚ค์›Œ๋“œ๋Š” ์Šค๋งˆํŠธ ์บ์ŠคํŠธ์™€๋„ ์—ฐ๊ด€์ด ์žˆ๋Š”๋ฐ, final๋กœ ์ง€์ •๋œ ํ”„๋กœํผํ‹ฐ๋Š” ํƒ€์ž…๊ฒ€์‚ฌ ๋’ค์— ๊ฐ’์ด ๋ณ€ํ•  ์ผ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์Šค๋งˆํŠธ ์บ์ŠคํŠธ์˜ ์กฐ๊ฑด์„ ๊นจ์ง€์•Š๋Š”๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

abstract๋กœ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฑด ์ž๋ฐ”์—๋„ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ต์ˆ™ ํ•  ๊ฒƒ์ด๋‹ค. abstract๋กœ ์„ ์–ธํ•œ ํด๋ž˜์Šค๋Š” ์ธ์Šคํ„ด์Šคํ™” ํ•  ์ˆ˜ ์—†๊ณ , ์ถ”์ƒ ๋ฉค๋ฒ„๊ฐ€ ํ•ญ์ƒ open์ด๊ธฐ ๋•Œ๋ฌธ์— open์œผ๋กœ ์„ ์–ธํ•œ ํด๋ž˜์Šค์™€ ๋‹ฌ๋ฆฌ ๊ฐ ๋ฉค๋ฒ„์— open์„ ์ ์–ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ถ”์ƒ๋ฉค๋ฒ„๋Š” ๊ตฌํ˜„์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ์˜ค๋ฒ„๋ผ์ด๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์ ๋„ ์žˆ๋‹ค.๊ทธ๋Ÿฌ๋‚˜ ์ถ”์ƒ ํด๋ž˜์Šค ์•ˆ์˜ ๋น„์ถ”์ƒ ๋ฉ”์„œ๋“œ๋Š” ์—ฌ์ „ํžˆ ํŒŒ์ด๋„์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„๋ผ์ด๋“œ๋ฅผ ์›ํ•œ๋‹ค๋ฉด open์„ ์ ์–ด์ค˜์•ผํ•œ๋‹ค.

public, internal, protected, private

๊ฐ€์‹œ์„ฑ ๋ณ€๊ฒฝ์ž๋“ค์ธ๋ฐ, ๋‚˜๋จธ์ง€ ์„ธ๊ฐœ๋Š” ์ต์ˆ™ํ•  ํ…Œ๋‹ˆ internal๋งŒ ๋ณด๊ฒ ๋‹ค. ๊ทธ ์ „์— ์ฝ”ํ‹€๋ฆฐ์˜ ๊ธฐ๋ณธ ๊ฐ€์‹œ์„ฑ์€ public์ด๊ณ  ์ž๋ฐ”๋Š” package-private๋‹ค. ์ฝ”ํ‹€๋ฆฐ์—์„œ internal์ด ๊ฐ™์€ ๋ชจ๋“ˆ์•ˆ์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๋Š” ๋ณ€๊ฒฝ์ž๊ธฐ ๋•Œ๋ฌธ์— package-private ์™€ ๋น„์Šทํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

๊ฐ€์‹œ์„ฑ ๊ทœ์น™์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋†’์€ ๊ฐ€์‹œ์„ฑ์—์„œ ๋‚ฎ์€ ๊ฐ€์‹œ์„ฑ(๋” ๊ฐœ์ธ์ ์ธ)์„ ์ฐธ์กฐํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•œ๋‹ค. ๊ฐ€์‹œ์„ฑ ๋ ˆ๋ฒจ์ด ๊ฐ–๊ฑฐ๋‚˜ ๋‚ฎ์€ ๊ฒŒ ๋†’์€ ๊ฒƒ์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ข…์˜ No-Read-Down ๊ทœ์น™์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. ํ™•์žฅํ•จ์ˆ˜๋กœ ์ ‘๊ทผํ•  ๋•Œ protected ํ”„๋กœํผํ‹ฐ/๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ๋„ ๊ธฐ์–ตํ•˜์ž.

internal์€ ์ปดํŒŒ์ผ์‹œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ์ƒ์—์„œ public์ด ๋œ๋‹ค.

ํด๋ž˜์Šค ์ค‘์ฒฉ, inner class

๋‹จ์ˆœ ํด๋ž˜์Šค ์ค‘์ฒฉ์€ ์ฝ”ํ‹€๋ฆฐ์—์„œ ์•ฝ๊ฐ„ ๋‹ค๋ฅด๋‹ค. ์ค‘์ฒฉ ๋œ ํด๋ž˜์Šค๊ฐ€ ์™ธ๋ถ€ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†๋‹ค๋Š” ์ ์ด ๊ทธ๊ฒƒ์ด๋‹ค. ์ฝ”ํ‹€๋ฆฐ์—์„œ ๊ทธ๋ƒฅ ์ค‘์ฒฉํ•œ ํด๋ž˜์Šค๋Š” ์ž๋ฐ”์—์„œ static class๋กœ ์ธ์‹๋˜์–ด ๋ฐ”๊นฅ์ชฝ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ํฌํ•จํ•˜์ง€์•Š๋Š”๋‹ค. inner class๋กœ ์„ ์–ธํ•œ ์ค‘์ฒฉ ํด๋ž˜์Šค๋Š” ์›ํ•˜๋˜ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

class Outer {
    inner class Inner {
        fun getOuterReference(): Outer = this@Outer
    }
}
 

๋ฐ”๊นฅ ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐ ํ•  ๋•Œ๋Š” this@๋กœ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. ์ค‘์ฒฉ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„ ๋•Œ๊ฐ€ ์–ธ์ œ ์ผ๊นŒ? ํด๋ž˜์Šค ๊ณ„์ธต์„ ๋งŒ๋“ค๋•Œ ๊ณ„์ธต์— ์†ํ•œ ํด๋ž˜์Šค์˜ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๊ณ  ์‹ถ์œผ๋ฉด, ๋‚ด๋ถ€ ์ค‘์ฒฉ๊ณผ ์ผ๋ฐ˜ ์ค‘์ฒฉ์„ ์ž˜ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ฒ ๋‹ค.

sealed

์ฝ”ํ‹€๋ฆฐ์— ๋“ฑ์žฅํ•˜๋Š” ์ค‘์š”ํ•œ ๊ฒƒ๋“ค ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. sealedํด๋ž˜์Šค๋Š” ์ƒ์œ„ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•œ ํ•˜์œ„ํด๋ž˜์Šค๋ฅผ ์ •์˜ ํ•  ๋•Œ, sealed class ์•ˆ์— ์ค‘์ฒฉ์‹œ์ผœ์„œ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค.

sealed class Expr {
    class Num(val value: Int) : Expr()
    class Sum(val left: Expr, val right: Expr) : Expr()
}

fun eval(e: Expr): Int =
    when (e) {
        is Expr.Num -> e.value
        is Expr.Sum -> eval(e.right) + eval(e.left)
    }
 

sealed class๋กœ ์ •์˜๋œ ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ •์˜ ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— else ๋ถ„๊ธฐ๋กœ ๋””ํดํŠธ ๊ฒ€์‚ฌ๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค. sealed ํด๋ž˜์Šค๋Š” ์ž๋™์œผ๋กœ open์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์†์‹œ์— ๋ณ„๋„๋กœ open์„ ๋ถ™์ผ ํ•„์š”๊ฐ€ ์—†๋‹ค.

์ƒ์„ฑ์ž: ์ฃผ์ƒ์„ฑ์ž, ๋ถ€์ƒ์„ฑ์ž

์ž๋ฐ”์—์„œ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•ด์„œ ์—ฌ๋Ÿฌ ์ƒ์„ฑ์ž๋ฅผ ๊ฐ–๊ฒŒ ํ•  ์ˆ˜์žˆ๋Š”๋ฐ, ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ์ฃผ ์ƒ์„ฑ์„ฑ์ž - ๋ถ€์ƒ์„ฑ์ž๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ ์ƒ์„ฑ์ž๋Š” ํด๋ž˜์Šค ๋ณธ๋ฌธ์ด ์•„๋‹ˆ๋ผ ํด๋ž˜์Šค ์„ ์–ธ์‹œ ๊ด„ํ˜ธ ์‚ฌ์ด์— ๋„ฃ๋Š”๋‹ค. ์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์ •ํ•˜๊ณ , ๊ทธ๊ฒƒ์— ์˜ํ•ด ์ดˆ๊ธฐํ™”๋˜๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ์“ฐ์ธ๋‹ค. ์ดˆ๊ธฐํ™” ๋ธ”๋ก์ธ init์—์„œ ๊ทธ ์ž‘์—…์„ ํ•˜๋ฉด ๋œ๋‹ค. ์ดˆ๊ธฐํ™” ๋ธ”๋ก์€ ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™” ๋  ๋•Œ ์‹คํ–‰๋œ๋‹ค. ์ดˆ๊ธฐํ™” ๋ธ”๋ก์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ์ฃผ ์ƒ์„ฑ์ž ์•ˆ์—์„œ๋Š” ๋ณ„๋„์˜ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฃผ ์ƒ์„ฑ์ž์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ”„๋กœํผํ‹ฐ ์ดˆ๊ธฐํ™”/ ์ดˆ๊ธฐํ™” ๋ธ”๋ก ์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ ์„ ๊ธฐ์–ตํ•˜์ž.

class User constructor(_nickname: String){
    val nickname: String
    init{
        nickname = _nickname   
    }
}
 

constructor ํ‚ค์›Œ๋“œ๋Š” ์ฃผ์ƒ์„ฑ์ž, ๋ถ€์ƒ์„ฑ์ž์— ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณ€์ˆ˜๋ช…์— _๋ฅผ ๋ถ™์ด๋ฉด ์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ์ž„์„ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฑด ์ •ํ•ด์ง„ ๊ฑด ์•„๋‹ˆ๊ณ  ์ผ์ข…์˜ ์ปจ๋ฒค์…˜์ด๋‹ค. this.val1 = val1 ๊ณผ ๊ฐ™์€ ๋Š๋‚Œ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ์ฃผ ์ƒ์„ฑ์ž์— ์•„์˜ˆ val nickname ์ด๋ผ๊ณ  ํ•ด๋ฒ„๋ฆฌ๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ์ด์ž ํ”„๋กœํผํ‹ฐ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋””ํดํŠธ ๊ฐ’์„ ์ œ๊ณต ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ด๋ฆ„์„ ์ง€์ •ํ•ด ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋ชจ๋“  ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋””ํดํŠธ ๊ฐ’์„ ์ง€์ •ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋Š” ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š”๋ฐ, ์ด ๊ธฐ๋Šฅ์€ DI(์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…)๊ณผ์ •์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋Š” ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•  ๋•Œ ํ†ตํ•ฉ์ด ์‰ฝ๋„๋ก ํ•ด์ค€๋‹ค.

์ƒ์†ํ•˜๋Š” ํด๋ž˜์Šค(๊ธฐ๋ฐ˜ ํด๋ž˜์Šค)๊ฐ€ ์žˆ๋‹ค๋ฉด ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•˜๋Š”๋ฐ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด ์ฃผ ์ƒ์„ฑ์ž ์ธ์ž๋ฅผ ๋„˜๊ฒจ์„œ ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค๋ฅผ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋ž˜์Šค๋ฅผ ์ธ์Šคํ„ด์Šคํ™” ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๊ณ ์‹ถ์œผ๋ฉด ์ƒ์„ฑ์ž๋ฅผ privateํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉด๋œ๋‹ค.

class User private constructor(){}
 

์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ๋น„๊ณต๊ฐœ ์ƒ์„ฑ์ž๋Š” companion object์—์„œ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค.

๋ถ€์ƒ์„ฑ์ž๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋‹ค๋ฅธ ์ƒ์„ฑ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ํด๋ž˜์Šค ํ™•์žฅ์‹œ ์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐํ™” ๋ฐฉ๋ฒ•์ด ์—ฌ๋Ÿฌ๊ฐœ ํ•„์š”ํ•  ๋•Œ๊ฐ€ ๊ทธ ๋•Œ๋‹ค. ์œ„์—์„œ ์‚ฌ์šฉํ•œ constructor๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ณ , ์ฃผ์ƒ์„ฑ์ž๊ฐ€ ์—†์ด ๋ถ€์ƒ์„ฑ์ž๋งŒ ์žˆ๋‹ค๋ฉด ์ƒ์œ„ํด๋ž˜์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ƒ์„ฑ์ž์—๊ฒŒ ์ƒ์„ฑ์„ ์œ„์ž„ํ•ด์•ผํ•œ๋‹ค.

class A : View{
    constructor(ctx: Context): super(ctx){
    
    }
    constructor(ctx: Context, arr: Attribute): this(ctx, attr){}
}
 

 

"๋Œ“๊ธ€, ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์‹œ๋ฉด ํฐ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค"
๋ฐ˜์‘ํ˜•

'๐Ÿ“– > ์ฝ”ํ‹€๋ฆฐ ์ธ ์•ก์…˜๐Ÿ“–' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Kotlin in action(5)  (0) 2023.10.10
Kotlin in action(4)  (0) 2023.10.10
Kotlin in action(2)  (0) 2023.10.10
Kotlin in action(9)  (0) 2023.10.10
Kotlin in action(1)  (0) 2023.10.10
COMMENT