์ธํฐํ์ด์ค ํ์ฅ
์ฝํ๋ฆฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก 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 |