#1. ν΄λμ€ κ³μΈ΅ μ μ
μΈν°νμ΄μ€
μ½νλ¦° μΈν°νμ΄μ€ μμλ μΆμ λ©μλλΏ μλλΌ κ΅¬νμ΄ μλ λ©μλλ μ μν μ μλ€.
μν(νλ)λ λ€μ΄κ° μ μλ€.
//μΈν°νμ΄μ€ μ μ
interface Clickable {
fun click()
}
//μΈν°νμ΄μ€ ꡬν
class Button : Clickable { //μ½νλ¦°μ ν΄λμ€ νμ₯κ³Ό μΈν°νμ΄μ€ ꡬν λͺ¨λ μ½λ‘ (:)μ λΆμΈλ€.
//μ€λ²λΌμ΄λ νμ
override fun click() = println("I was clicked")
}
μλ°μ λ§μ°¬κ°μ§λ‘ μΈν°νμ΄μ€λ κ°μ μ νμμ΄ λ§μλλ‘ κ΅¬νν μ μμ§λ§, ν΄λμ€λ μ€μ§ νλλ§ νμ₯ν μ μλ€.
μμ ν΄λμ€μ μλ λ©μλμ μκ·Έλμ²κ° κ°μ λ©μλλ₯Ό μ°μ°ν νμ ν΄λμ€μ μ μΈνλ κ²½μ°, μ»΄νμΌμ΄ μ λκΈ° λλ¬Έμ overrideλ₯Ό λΆμ΄κ±°λ λ©μλ μ΄λ¦μ λ°κΏμΌ νλ€.
- μμ) λμΌν λ©μλκ° μλ μΈν°νμ΄μ€λ₯Ό λμμ ꡬνν λ
interface Clickable {
fun click()
fun showOff() = println("I'm clickable!") //λν΄νΈ ꡬν μ μ
}
interface Focusable {
fun setFocus(b: Boolean) =
println("I ${if (b) "got" else "lost"} focus.")
fun showOff() = println("I'm focusable!")
}
ν΄λμ€κ° ꡬννλ λ μμ μΈν°νμ΄μ€μ μ μλ showOff ꡬνμ λ체ν μ€λ²λΌμ΄λ© λ©μλλ₯Ό μ§μ μ 곡νμ§ μμΌλ©΄ μ»΄νμΌ μ€λ₯κ° λ°μνλ€.
The class 'Button' must override public open fun showOff() because it inherits many implementations of it.
μ΄λ¦κ³Ό μκ·Έλμ²κ° κ°μ λ©€λ² λ©μλμ λν΄ λ μ΄μμ λν΄νΈ ꡬνμ΄ μλ κ²½μ°, μΈν°νμ΄μ€λ₯Ό ꡬννλ νμ ν΄λμ€μμ λͺ μμ μΌλ‘ μλ‘μ΄ κ΅¬νμ μ 곡ν΄μΌ νλ€.
class Button : Clickable, Focusable {
override fun click() = println("I was clicked")
override fun showOff() {
super<Clickable>.showOff()
super<Focusable>.showOff()
}
}
super μ²λΌ κΊ½μ μμ νμ μ μ§μ νλ€. (μλ°μμλ Clickable.super)
μ½νλ¦°μ μλ° 6κ³Ό νΈνλλ―λ‘, μλ°μμλ μ½νλ¦°μ λν΄νΈ λ©μλ ꡬνμ μμ‘΄ν μ μλ€. λν΄νΈ λ©μλκ° μλ μΈν°νμ΄μ€λ₯Ό μΌλ° μΈν°νμ΄μ€μ λν΄νΈ λ©μλ ꡬνμ΄ μ μ λ©μλλ‘ λ€μ΄μλ ν΄λμ€λ₯Ό μ‘°ν©ν΄ ꡬνλλ€.
open, final, abstract
μ½νλ¦°μ ν΄λμ€μ λ©μλλ κΈ°λ³Έμ μΌλ‘ finalμ΄λ€.
μμμ νμ©νλ €λ©΄ open λ³κ²½μλ₯Ό λΆμ¬μΌ νλ€.
μ€λ²λΌμ΄λλ₯Ό νμ©νκ³ μΆμ λ©μλλ νλ‘νΌν° μμλ open λ³κ²½μλ₯Ό λΆμ¬μΌ νλ€.
open class RichButton : Clickable { //μ΄ ν΄λμ€λ μ΄λ € μλ€.
fun disable() {} //μ΄ ν¨μλ μ€λ²λΌμ΄λν μ μλ€.
open fun animate() {} //μ€λ²λΌμ΄λ κ°λ₯νλ€.
override fun click() {} //μμ ν΄λμ€μ λ©μλλ₯Ό μ€λ²λΌμ΄λνλ€. (μ€λ²λΌμ΄λν λ©μλλ κΈ°λ³ΈμΌλ‘ μ΄λ €μλ€.)
}
open class RichButton : Clickable {
final override fun click() {} //μ€λ²λΌμ΄λν λ©μλμ ꡬνμ νμ ν΄λμ€μμ μ€λ²λΌμ΄λνμ§ λͺ»νκ² νλ €λ©΄ finalμ λΆμΈλ€.
}
abstract: μΆμ ν΄λμ€ μ μΈ
μΆμ λ©€λ²λ νμ μ΄λ € μλ€. -> openμ λΆμΌ νμκ° μλ€.
μΈν°νμ΄μ€ λ©€λ²λ final, open, abstractλ₯Ό μ¬μ©νμ§ μλλ€.
μΈν°νμ΄μ€ λ©€λ²λ νμ μ΄λ € μμΌλ©° finalλ‘ λ³κ²½ν μ μλ€.
λ³κ²½μ | μ€λ²λΌμ΄λ | μ€λͺ |
fianl | λΆκ°λ₯ | ν΄λμ€ λ©€λ²μ κΈ°λ³Έ λ³κ²½μ |
open | κ°λ₯ | openμ λͺ μν΄μΌ μ€λ²λΌμ΄λ κ°λ₯ |
abstract | νμ | μΆμ ν΄λμ€μ λ©€λ²μλ§ λΆμΌ μ μλ€. μΆμ λ©€λ²λ ꡬνμ΄ μμΌλ©΄ μ λλ€. |
κ°μμ± λ³κ²½μ
: μ μΈμ λν ν΄λμ€ μΈλΆμ μ κ·Όμ μ μ΄νλ€.
μ무 λ³κ²½μλ μλ κ²½μ° λͺ¨λ public μ΄λ€.
μ½νλ¦°μ package-privateμ μ¬μ©νμ§ μλλ€. (ν¨ν€μ§λ₯Ό λ€μμ€νμ΄μ€ κ΄λ¦¬ μ©λλ‘λ§ μ¬μ©νκΈ° λλ¬Έ)
λμ internalμ λμ
: λͺ¨λ λ΄λΆμμλ§ λ³Ό μ μμ
μ½νλ¦°μ μ΅μμ μ μΈ(ν΄λμ€, ν¨μ, νλ‘νΌν°)μ λν΄ private κ°μμ±μ μ 곡νλ€.
-> κ·Έ μ μΈμ΄ λ€μ΄μλ νμΌ λ΄λΆμμλ§ μ¬μ©ν μ μλ€.
λ³κ²½μ | ν΄λμ€ λ©€λ² | μ΅μμ μ μΈ |
public (default) | λͺ¨λ κ³³μμ | λͺ¨λ κ³³μμ |
internal | κ°μ λͺ¨λ μμμλ§ | κ°μ λͺ¨λ μμμλ§ |
protected | νμ ν΄λμ€ μμμλ§ | (μ΅μμ μ μΈμ μ μ© λΆκ°λ₯) |
private | κ°μ ν΄λμ€ μμμλ§ | κ°μ νμΌ μμμλ§ |
- μ΄λ€ ν΄λμ€μ κΈ°λ° νμ λͺ©λ‘μ λ€μ΄μλ νμ μ΄λ μ λ€λ¦ ν΄λμ€μ νμ νλΌλ―Έν°μ λ€μ΄μλ νμ μ κ°μμ±μ ν΄λμ€ μμ μ κ°μμ±κ³Ό κ°κ±°λ λμμΌ νκ³ ,
- λ©μλ μκ·Έλμ²μ μ¬μ©λ λͺ¨λ νμ μ κ°μμ±μ κ·Έ λ©μλμ κ°μμ±κ³Ό κ°κ±°λ λμμΌ νλ€.
μ½νλ¦°μμλ μΈλΆ ν΄λμ€κ° λ΄λΆ ν΄λμ€λ μ€μ²©λ ν΄λμ€μ private λ©€λ²μ μ κ·Όν μ μλ€.
λ΄λΆ ν΄λμ€μ μ€μ²©λ ν΄λμ€
μ½νλ¦°μ μ€μ²© ν΄λμ€λ λͺ μμ μΌλ‘ μμ²νμ§ μλ ν λ°κΉ₯ ν΄λμ€ μΈμ€ν΄μ€μ λν μ κ·Ό κΆνμ΄ μλ€.
λ°κΉ₯ ν΄λμ€μ λν μ°Έμ‘°λ₯Ό ν¬ν¨νκ³ μΆλ€λ©΄ inner λ³κ²½μλ₯Ό λΆμ¬μΌ νλ€.
ν΄λμ€ κ³μΈ΅μ λ§λ€λ κ·Έ κ³μΈ΅μ μν ν΄λμ€μ μλ₯Ό μ ννκ³ μΆμ κ²½μ° μ€μ²© ν΄λμ€λ₯Ό μ°λ©΄ νΈλ¦¬νλ€.
sealed ν΄λμ€
μμ ν΄λμ€λ₯Ό μμν νμ ν΄λμ€ μ μλ₯Ό μ νν μ μλ€.
sealed ν΄λμ€μ νμ ν΄λμ€λ₯Ό μ μν λλ λ°λμ μμ ν΄λμ€ μμ μ€μ²©μμΌμΌ νλ€. (1.0 λ²μ )
1.1 λ²μ λΆν°λ κ°μ νμΌ μμ νμ ν΄λμ€λ₯Ό λ§λ€ μ μλ€.
1.5 λ²μ λΆν°λ sealed μΈν°νμ΄μ€λ μ μ κ°λ₯νλ€.
sealed class Expr {
class Num(val value: Int) : Expr()
class Sum(val left: Expr, val right: Expr) : Expr()
}
when μμμ sealed ν΄λμ€μ λͺ¨λ νμ ν΄λμ€λ₯Ό μ²λ¦¬νλ€λ©΄ else λΆκΈ°λ νμ μλ€.
#2. λ»νμ§ μμ μμ±μμ νλ‘νΌν°λ₯Ό κ°λ ν΄λμ€ μ μΈ
μ½νλ¦°μ μ£Ό μμ±μ(primary constructor), λΆ μμ±μ(secondary constructor), μ΄κΈ°ν λΈλμ μ 곡νλ€.
constructor ν€μλλ‘ μ£Ό μμ±μλ λΆ μμ±μλ₯Ό μ μνλ€.
ν΄λμ€ μ΄κΈ°ν: μ£Ό μμ±μμ μ΄κΈ°ν λΈλ
μ£Ό μμ±μ
- μμ±μ νλΌλ―Έν° μ§μ
- μ΄κΈ°νλλ νλ‘νΌν°λ₯Ό μ μ
class User constructor(_nickname: String) { //μ£Ό μμ±μ μ μ
val nickname: String
init { //μ΄κΈ°ν λΈλ
nickname = _nickname
}
}
μ΄κΈ°ν λΈλμ μΈμ€ν΄μ€νλ λ μ€νλ μ΄κΈ°ν μ½λκ° λ€μ΄κ°λ©°, μ£Ό μμ±μμ ν¨κ» μ¬μ©λλ€.
(μ£Ό μμ±μλ λ³λμ μ½λλ₯Ό ν¬ν¨ν μ μμΌλ―λ‘ μ΄κΈ°ν λΈλμ΄ νμνλ€.)
μ΄κΈ°ν λΈλμ μ¬λ¬ κ° μμ± κ°λ₯νλ€.
νλ‘νΌν°λ₯Ό μ΄κΈ°ννλ μμ΄λ μ΄κΈ°ν λΈλ μμμλ§ μ£Ό μμ±μμ νλΌλ―Έν°λ₯Ό μ°Έμ‘°ν μ μλ€.
μ£Ό μμ±μμ νλΌλ―Έν°λ‘ νλ‘νΌν°λ₯Ό μ΄κΈ°ννλ€λ©΄, κ·Έ νλΌλ―Έν°μ valμ μΆκ°νλ λ°©μμΌλ‘ νλ‘νΌν° μ μμ μ΄κΈ°νλ₯Ό κ°λ΅ν μΈ μ μλ€.
class User(val nickname: String,
val isSubscribed: Boolean = true) //μμ±μ νλΌλ―Έν°μλ λν΄νΈ κ°μ μ μν μ μλ€.
κ°μ²΄ μμ± μμλ new ν€μλμμ΄ μ§μ νΈμΆνλ€.
val alice = User("Alice")
λͺ¨λ μμ±μ νλΌλ―Έν°μ λν΄νΈ κ°μ μ§μ νλ©΄ μ»΄νμΌλ¬κ° μλμΌλ‘ νλΌλ―Έν°κ° μλ μμ±μλ₯Ό λ§λ€μ΄μ€λ€.
λ³λλ‘ μμ±μλ₯Ό μ μνμ§ μμμ λλ μλμΌλ‘ νλΌλ―Έν°κ° μλ λν΄νΈ μμ±μλ₯Ό λ§λ€μ΄μ€λ€.
κΈ°λ° ν΄λμ€κ° μλ κ²½μ°, λ°λμ κΈ°λ° ν΄λμ€μ μμ±μλ₯Ό νΈμΆν΄μΌ νλ€.
open class User(val nickname: String) { ... }
class TwitterUser(nickname: String) : User(nickname) { ... } //κΈ°λ° ν΄λμ€μ μμ±μ νλΌλ―Έν°λ₯Ό λκΉ
class RadioButton: Button() //Buttonμ μμ±μ νΈμΆ
ν΄λμ€ μΈλΆμμ μΈμ€ν΄μ€ννμ§ λͺ»νκ² λ§κ³ μΆλ€λ©΄ λͺ¨λ μμ±μλ₯Ό privateμΌλ‘ λ§λ λ€.
class Secretive private constructor() {} //μ£Ό μμ±μλ₯Ό privateμΌλ‘ λ§λλ μμ
λΆ μμ±μ
ν΄λμ€μ μ£Ό μμ±μκ° μλ€λ©΄ λͺ¨λ λΆ μμ±μλ λ°λμ μμ ν΄λμ€λ₯Ό μ΄κΈ°ννκ±°λ λ€λ₯Έ μμ±μμκ² μμ±μ μμν΄μΌ νλ€.
λΆ μμ±μμ μ£Ό λͺ©μ μ μλ° μνΈμ΄μ©μ±μ΄μ§λ§, ν΄λμ€ μΈμ€ν΄μ€λ₯Ό μμ±ν λ νλΌλ―Έν° λͺ©λ‘μ΄ λ€λ₯Έ μμ± λ°©λ²μ΄ μ¬λΏ μ‘΄μ¬νλ κ²½μ°μλ λΆ μμ±μλ₯Ό μ¬λΏ λ μ λ°μ μλ€.
class MyButton : View {
constructor(ctx: Context): this(ctx, MY_STYLE) { //this: μμ μ λ€λ₯Έ μμ±μμ μμνλ€.
// ...
}
constructor(ctx: Context, attr: AttributeSet): super(ctx, attr) { //super: μμ ν΄λμ€μ μμ±μλ₯Ό νΈμΆνλ€.
// ...
}
}
μΈν°νμ΄μ€μ μ μΈλ νλ‘νΌν° ꡬν
μ½νλ¦°μμλ μΈν°νμ΄μ€μ μΆμ νλ‘νΌν° μ μΈμ λ£μ μ μλ€.
interface User {
val nickname: String
}
-> nicknameμ κ°μ μ»μ μ μλ λ°©λ²μ μ 곡ν΄μΌ νλ€λ λ»μ΄λ€.
ꡬν λ°©λ² 1) μ£Ό μμ±μ μμ μ§μ μ μΈνκΈ°
class PrivateUser(override val nickname: String) : User
Userμ νλ‘νΌν°λ₯Ό ꡬννλ κ²μ΄λ―λ‘, overrideλ₯Ό λΆμ¬μ€μΌ νλ€.
ꡬν λ°©λ² 2) Custom Getter
class SubscribingUser(val email: String) : User {
override val nickname: String
get() = email.substringBefore('@') )
}
-> λ·λ°μΉ¨νλ νλ(backing field)μ μ μ₯νμ§ μκ³ , λ§€λ² μ΄λ©μΌ μ£Όμμμ nicknameμ κ³μ°ν΄ λ°ννλ€.
ꡬν λ°©λ² 3) νλ‘νΌν° μ΄κΈ°ν μ
class FacebookUser(val accountId: Int) : User {
override val nickname = getFacebookName(accountId)
}
-> μ΄κΈ°ν λ¨κ³μμ getFacebookNameμ΄ ν λ²λ§ νΈμΆλλ€.
κ°μ²΄ μ΄κΈ°ν μ κ³μ°ν λ°μ΄ν°λ₯Ό λ·λ°μΉ¨νλ νλμ μ μ₯νλ€κ° λΆλ¬μ€λ λ°©μμ νμ©νλ€.
μΈν°νμ΄μ€μλ μΆμ νλ‘νΌν° λΏλ§ μλλΌ Getterμ Setterκ° μλ νλ‘νΌν°λ₯Ό μ μΈν μ μλ€.
Getter, Setterλ λ·λ°μΉ¨νλ νλλ₯Ό μ°Έμ‘°ν μ μλ€.
interface User {
val email: String //λ°λμ μ€λ²λΌμ΄λν΄μΌ νλ€.
val nickname: String
get() = email.substringBefore('@')
}
Getterμ Setterμμ λ·λ°μΉ¨νλ νλ(Backing field) μ κ·Ό
class User(val name: String) {
var address: String = "unspecified"
set(value: String) {
println("""
Address was changed for $name:
"$field" -> "$value".""".trimIndent()) //fieldλ‘ κ° μ½κΈ°
field = value //backing field κ° λ³κ²½
}
}
fieldλΌλ μλ³μλ₯Ό ν΅ν΄ λ·λ°μΉ¨νλ νλμ μ κ·Όν μ μλ€.
Getterμμλ field κ°μ μ½μ μλ§ μκ³ , Setterμμλ field κ°μ μ½κ±°λ μΈ μ μλ€.
fieldλ₯Ό μ¬μ©νμ§ μλ 컀μ€ν
μ κ·Όμλ₯Ό ꡬννλ©΄ λ·λ°μΉ¨νλ νλλ μ‘΄μ¬νμ§ μλλ€.
(valμΈ κ²½μ° Getterμ fieldκ° μμΌλ©΄ λμ§λ§, varμΈ κ²½μ° Getter/Setter λͺ¨λ μμ΄μΌ νλ€.)
μ κ·Όμμ κ°μμ± λ³κ²½
μ κ·Όμμ κ°μμ±μ κΈ°λ³Έμ μΌλ‘ νλ‘νΌν°μ κ°μμ±κ³Ό κ°λ€.
λ³κ²½μ μνλ€λ©΄ getμ΄λ set μμ κ°μμ± λ³κ²½μλ₯Ό μΆκ°νλ€.
class LengthCounter {
var counter: Int = 0
private set //Setterλ₯Ό privateμΌλ‘ λ§λ λ€.
}
#3. λ°μ΄ν° ν΄λμ€μ ν΄λμ€ μμ
λͺ¨λ ν΄λμ€κ° μ μν΄μΌ νλ λ©μλ
1. toString()
κΈ°λ³Έ μ 곡λλ κ°μ²΄μ λ¬Έμμ΄ ννμ Client@5e9f23b4μ κ°μ λ°©μμΈλ°, κΈ°λ³Έ ꡬνμ λ°κΎΈλ €λ©΄ toString()μ μ€λ²λΌμ΄λ ν΄μΌ νλ€. (μλ°μ λμΌ)
2. equals(), hashCode()
κ°μ²΄μ λλ±μ± κ²μ¬
μ½νλ¦°μμλ == μ°μ°μλ‘ equals κ²μ¬λ₯Ό νλ€.
μ°Έμ‘° λμΌμ± κ²μ¬λ ===μ μ΄μ©νλ€.
data class
λ°μ΄ν°λ₯Ό μ μ₯νλ μν λ§ νλ ν΄λμ€
data classλ νμν λ©μλλ₯Ό μ»΄νμΌλ¬κ° μλμΌλ‘ λ§λ€μ΄ μ€λ€.
- equals()
- hashCode()
- toString()
equalsμ hashCodeλ μ£Ό μμ±μμ λμ΄λ λͺ¨λ νλ‘νΌν°λ₯Ό κ³ λ €ν΄ λ§λ€μ΄μ§λ€.
-> μ£Ό μμ±μ λ°μ μ μλ νλ‘νΌν°λ κ³ λ € λμμ΄ μλλ€.
copy()
λ°μ΄ν° ν΄λμ€μ λͺ¨λ νλ‘νΌν°λ₯Ό μ½κΈ° μ μ©μΌλ‘ λ§λ€μ΄μ λΆλ³ ν΄λμ€λ‘ λ§λλ κ²μ κΆμ₯νλ€.
(HashMap λ±μ 컨ν
μ΄λμ κ°μ²΄λ₯Ό λ΄λ κ²½μ°μλ λΆλ³μ±μ΄ νμμ μ΄λ€.)
λ€μ€ μ€λ λ νλ‘κ·Έλ¨μΈ κ²½μ° λΆλ³μ±μ΄ λμ± μ€μνλ€.
λ°μ΄ν° ν΄λμ€λ₯Ό λΆλ³ κ°μ²΄λ‘ λ μ½κ² νμ©ν μ μλλ‘ κ°μ²΄λ₯Ό 볡μ¬νλ©΄μ μΌλΆ νλ‘νΌν°λ₯Ό λ°κΏ μ μλ copy λ©μλλ₯Ό μ 곡νλ€.
ν΄λμ€ μμ: by
by ν€μλλ₯Ό ν΅ν΄ κ·Έ μΈν°νμ΄μ€μ λν ꡬνμ λ€λ₯Έ κ°μ²΄μ μμμ€μ΄λΌλ κ²μ λͺ μν μ μλ€.
class CountingSet<T>(
val innerSet: MutableCollection<T> = HashSet<T>()
) : MutableCollection<T> by innerSet { //MutableCollectionμ ꡬνμ innerSetμ μμνλ€.
var objectsAdded = 0
override fun add(element: T): Boolean { //μ΄ λ©μλλ μμνμ§ μκ³ μλ‘μ΄ κ΅¬νμ μ 곡νλ€.
objectsAdded++
return innerSet.add(element)
}
}
#4. object: ν΄λμ€ μ μΈκ³Ό μΈμ€ν΄μ€ μμ±
ν΄λμ€λ₯Ό μ μνλ©΄μ λμμ μΈμ€ν΄μ€λ₯Ό μμ±νλ€.
- objectλ μ±κΈν΄ μ μ λ°©λ² μ€ νλμ΄λ€.
- companion object(λλ°κ°μ²΄)λ μΈμ€ν΄μ€ λ©μλλ μλμ§λ§ μ΄λ€ ν΄λμ€μ κ΄λ ¨μλ λ©μλμ ν©ν 리 λ©μλλ₯Ό λ΄μ λ μ°μΈλ€.
- object μμ μλ°μ 무λͺ λ΄λΆ ν΄λμ€ λμ μ°μΈλ€.
κ°μ²΄ μ μΈ: μ±κΈν΄ μ½κ² λ§λ€κΈ°
: ν΄λμ€ μ μΈκ³Ό ν΄λμ€μ μν λ¨μΌ μΈμ€ν΄μ€μ μ μΈμ ν©μΉ λ§μ΄λ€.
κ°μ²΄ μ μΈμ μμ±μλ μΈ μ μλ€.
μ±κΈν΄ κ°μ²΄κ° κ°μ²΄ μ μΈλ¬Έμ΄ μλ μμΉμμ μ¦μ λ§λ€μ΄μ§λ€.
ꡬν λ΄λΆμ λ€λ₯Έ μνκ° νμνμ§ μμ κ²½μ°μ μ μ©νλ€.
- μ½νλ¦° κ°μ²΄λ₯Ό μλ°μμ μ¬μ©ν λ
μ½νλ¦° κ°μ²΄ μ μΈμ μ μΌν μΈμ€ν΄μ€μ λν μ μ νλκ° μλ μλ° ν΄λμ€λ‘ μ»΄νμΌλλ€.
μΈμ€ν΄μ€ νλ μ΄λ¦μ νμ INSTANCE μ΄λ€.
λλ° κ°μ²΄: ν©ν 리 λ©μλμ μ μ λ©€λ²κ° λ€μ΄κ° μ₯μ
μ½νλ¦°μ static ν€μλλ₯Ό μ§μνμ§ μλλ€.
λμ μ΅μμ ν¨μμ κ°μ²΄ μ μΈμ μ 곡νλ€. (λλΆλΆμ κ²½μ° μ΅μμ ν¨μλ₯Ό λ κΆμ₯νλ€.)
*μ΅μμ ν¨μλ ν΄λμ€μ private λ©€λ²μ μ κ·Όν μ μλ€.
-> ν΄λμ€ λ΄λΆ μ 보μ μ κ·Όν΄μΌ νλ ν¨μκ° νμν λλ ν΄λμ€μ μ€μ²©λ κ°μ²΄ μ μΈμ λ©€λ² ν¨μλ‘ μ μν΄μΌ νλ€.
λλ° κ°μ²΄λ companion object ν€μλλ‘ λ§λ€ μ μλ€.
λλ° κ°μ²΄λ μμ μ λλ¬μΌ ν΄λμ€μ λͺ¨λ private λ©€λ², private μμ±μμ μ κ·Όν μ μλ€.
-> ν©ν 리 ν¨ν΄μ ꡬννκΈ° μ ν©νλ€.
class User private constructor(val nickname: String) { //μ£Ό μμ±μλ₯Ό λΉκ³΅κ°λ‘ λ§λ λ€.
companion object {
fun newSubscribingUser(email: String) = //λλ° κ°μ²΄ μμ ν©ν 리 λ©μλλ₯Ό μ μνλ€.
User(email.substringBefore('@'))
fun newFacebookUser(accountId: Int) =
User(getFacebookName(accountId))
}
}
λλ° κ°μ²΄λ₯Ό μΌλ° κ°μ²΄μ²λΌ μ¬μ©
λλ° κ°μ²΄λ ν΄λμ€ μμ μ μλ μΌλ° κ°μ²΄μ΄λ€.
-> κ°μ²΄μ μ΄λ¦μ λΆμ΄κ±°λ, λλ° κ°μ²΄κ° μΈν°νμ΄μ€λ₯Ό μμνκ±°λ, λλ° κ°μ²΄ μμ νμ₯ ν¨μμ νλ‘νΌν°λ₯Ό μ μν μ μλ€.
class Person(val name: String) {
companion object Loader { //λλ° κ°μ²΄μ μ΄λ¦μ λΆμΈλ€.
fun fromJSON(jsonText: String): Person = ...
}
}
//μ κ·Όν λ
Person.Loader.fromJSON(...)
- λλ° κ°μ²΄μμ μΈν°νμ΄μ€ ꡬν
interface JSONFactory<T> {
fun fromJSON(jsonText: String): T
}
class Person(val name: String) {
companion object : JSONFactory<Person> {
//...
}
}
λλ° κ°μ²΄μ μΈμ€ν΄μ€λ₯Ό μ λ¬ν μλ μλ€.
fun loadFromJSON<T>(factory: JSONFactory<T>): T {
//...
}
loadFromJSON(Person) //μΈμ€ν΄μ€λ₯Ό λκΈΈ λ Person ν΄λμ€(λλ° κ°μ²΄λ₯Ό κ°μΈλ ν΄λμ€)μ μ΄λ¦μΌλ‘ λκΈ΄λ€.
- λλ° κ°μ²΄ νμ₯
ν΄λμ€μ λλ° κ°μ²΄κ° μμΌλ©΄ κ·Έ κ°μ²΄ μμ ν¨μλ₯Ό μ μν¨μΌλ‘μ¨ ν΄λμ€μ λν΄ νΈμΆν μ μλ νμ₯ ν¨μλ₯Ό λ§λ€ μ μλ€.
κ°μ²΄ μ: 무λͺ λ΄λΆ ν΄λμ€λ₯Ό λ€λ₯Έ λ°©μμΌλ‘ μμ±
무λͺ κ°μ²΄(anonymous object)λ₯Ό μ μν λλ object ν€μλλ₯Ό μ΄λ€.
window.addMouseListener(
object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) {
// ...
}
override fun mouseEntered(e: MouseEvent) {
// ...
}
}
}
κ°μ²΄μ μ΄λ¦μ λΆμ¬μΌ νλ€λ©΄ λ³μμ 무λͺ
κ°μ²΄λ₯Ό λμ
νλ©΄ λλ€.
μ½νλ¦°μ 무λͺ
ν΄λμ€λ μ¬λ¬ μΈν°νμ΄μ€λ₯Ό ꡬννκ±°λ ν΄λμ€λ₯Ό νμ₯νλ©΄μ μΈν°νμ΄μ€λ₯Ό ꡬνν μ μλ€.
무λͺ κ°μ²΄λ μ±κΈν΄μ΄ μλλ€.
μλ°μ λ¬λ¦¬ finalμ΄ μλ λ³μλ κ°μ²΄ μ μμμ μ¬μ©ν μ μλ€.
'κ°λ° > Kotlin' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Ktor] 1. ν΄λΌμ΄μΈνΈ, Engine (0) | 2021.08.04 |
---|---|
[Kotlin In Action] 5. λλ€λ‘ νλ‘κ·Έλλ° (1) | 2021.05.29 |
[Kotlin In Action] 3. ν¨μ μ μμ νΈμΆ (0) | 2021.05.10 |
[Kotlin In Action] 2. μ½νλ¦° κΈ°μ΄ (0) | 2021.05.10 |
[Kotlin In Action] 1. μ½νλ¦°μ΄λ 무μμ΄λ©°, μ νμνκ°? (0) | 2021.05.09 |