μλ°λ₯Ό 곡λΆνλ©° κ°μ₯ μλ―Έ μκ² μ½μ μ± μ [μ΄νν°λΈ μλ°]μ΄λ€.
μλ°λ₯Ό λ§λ κ°λ°μκ° μ§μ μ§νν μ± μ΄λ―λ‘, μλ°λ₯Ό μλ°λ΅κ² μ¬μ©νλ λ°©λ²μ΄ μμ£Ό λͺ ννκ² μ€λͺ λμ΄ μλ€.
κ°μ₯ 첫 μ±ν°μΈ 'μμ±μ λμ ν©ν 리 λ©μλλ₯Ό μ¬μ©νλΌ'λΌλ μμ΄ν μ κ΅μ₯ν μλ―Έ μκ² μ½κ² λμκ³ , κ·Έ λ΄μ©μ μ½λλ₯Ό μμ±ν λ μ μ©νμλ€.
μ½νλ¦°λ μλ°μ μ΄μ μ κ·Έλλ‘ κ°μ Έκ° μΈμ΄μ΄λ―λ‘, λΉμ·νκ² μ μ© λλ λΆλΆμ΄ μμμ§λ₯Ό μκ°ν΄ λ΄€λ€.
νμ¬μ λ€μ΄κ°μ μ½νλ¦°μ λ°°μ°κ³ μ½λλ₯Ό μμ±νλ©΄μ, κ°μ₯ λμ λμλ λΆλΆμ΄ dto κ°μ²΄λ₯Ό 맀ννλ λΆλΆμ΄μκ³ , ν©ν 리 λ©μλλ₯Ό μ¬μ©νλ©΄ μ΄λ¨κΉλΌλ μκ°μ νλ€.
μ½νλ¦°μ μ¬μ©νλ λΆλ€κ³Ό ꡬκΈλ§μ ν΅ν΄ μλ°μ λμΌνκ² ν©ν 리 λ©μλλ₯Ό λ§μ΄λ€ μ¬μ©νλ€λ μ 보λ₯Ό μ»μκ³ , κ·Έλλ‘ μ μ©νμλ€.
μ΄νν°λΈ μ½νλ¦° μ± μ νΌμΉλ©° λͺ©μ°¨λ₯Ό νμμ λ μ΄ μ±ν°κ° λμ λμκ³ , λ΄κ° μλ μ 보μ λΉκ΅νλ©° μ½μΌλ©΄ μ¬λ°κ² λ€λ μκ°μ νκ³ λΉλ‘μ μ½κ² λμλ€. κ·Έ λ΄μ©μ μ λ¦¬ν΄ λ³Έλ€.
ν©ν 리 ν¨μμ μ΄μ
μμ±μμ μν μ λμ νλ€.
μμ±μμ λ€λ₯΄κ² ν¨μμ μλ―Έ μλ μ΄λ¦μ λΆμΌ μ μλ€.
κ°λ Ή κ°μ²΄λ₯Ό μμ±νκΈ° μν΄ νμν νλΌλ―Έν°κ° 무μμΈμ§ λͺ μλ₯Ό ν μ μλ€λ μ μ΄λ€.
μ΄λ₯Ό ν λ©΄,
class ArrayList {
companion object {
fun withSize(size: Int) : ArrayList {
return //...
}
}
}
ArrayList κ°μ²΄λ₯Ό μμ±νκΈ° μν withSize() ν©ν 리 ν¨μλ μ¬μ΄μ¦λ₯Ό νλΌλ―Έν°λ‘ λ°λ κ°μ²΄λ₯Ό μ 곡νλ€λ μλ―Έλ₯Ό λͺ ννκ² μ μ μλ€.
λν, ν¨μκ° μνλ ννμ νμ μ 리ν΄ν μ μλ€.
κ°λ Ή listof()λΌλ ν¨μλ₯Ό λ μ¬λ Έμ λ, List μΈν°νμ΄μ€ νμ μ return νλ€λ μ μμ κ·Έ μλ―Έλ₯Ό μ½νλ¦° λΌμ΄λΈλ¬λ¦¬κ° μΆ©μ‘±μν€κ³ μλ€.
νΈμΆλ λλ§λ€ μ κ°μ²΄λ₯Ό λ§λ€ νμκ° μλ€.
μ±κΈν΄ κ°μ²΄λ₯Ό μμ±νλ€κ±°λ, μΊμ±μ μ΄μ©ν μκ° μλ€.
κ°μ²΄ μμ±μ΄ λΆκ°λ₯ν κ²½μ°, nullμ return ν μ μλ€.
μ΄λ₯Ό ν λ©΄, Connection.createOrNull() λ±λ±..
μ‘΄μ¬νμ§ μλ κ°μ²΄λ₯Ό return ν μλ μλ€.
μμΌλ‘ λ§λ€μ΄μ§ κ°μ²΄λ₯Ό μ¬μ©νκ±°λ νλ½μ κ°μ²΄λ₯Ό μ¬μ©ν μ μλ€.
κ°μ²΄ μΈλΆμ ν©ν 리 ν¨μλ₯Ό μ μ©ν μ μλ€.
κ°μμ± μ‘°μ μ΄ κ°λ₯ν κ²μ΄ μ₯μ μ΄λ©°, κ°μ νμΌ νΉμ κ°μ λͺ¨λμμλ§ μ κ·Όνκ² μ§μ ν μ μλ€.
ν©ν 리 ν¨μλ μμ±μλ₯Ό λ§λ€κΈ° μν 볡μ‘ν κ°μ²΄λ λ§λ€ μ μλ€.
λν, 무쑰건 νΈμΆλλ μμ±μλ₯Ό μνλ μκΈ°μ νΈμΆν μ μλ€.
μ΄μ²λΌ μ₯μ μ΄ μ λ§ λ§λ€.
μ½νλ¦°μμ ν©ν 리 ν¨μλ₯Ό μμ±νλ λ°©λ²μ μμ보μ.
Companion ν©ν 리 ν¨μ
μ½νλ¦°μμ ν©ν 리 ν¨μλ₯Ό μ μνλ κ°μ₯ μΌλ°μ μΈ λ°©λ²μ΄λ€.
class MyLinkedList<T>(
val head: T,
val tail: MyLinkedList<T>?
) {
companion object {
fun <T> of(vararg elements: T) : MyLinkedList<T>? {
// ...
}
}
}
κ°μ₯ μ΅μν λ°©λ²μ΄λ€.
μ½νλ¦°μμλ interfaceμλ companion objectλ₯Ό μ¬μ©ν μ μμ΄ λμΌνκ² ν©ν 리 ν¨μλ₯Ό μ μΈν μ μλ€.
class MyLinkedList<T>(
val head: T,
val tail: MyLinkedList<T>?
): MyList<T> {
// ...
}
interface MyList<T> {
//...
companion object {
fun <T> of(vararg elements: T) : MyList<T>? {
// ...
}
}
}
val list = MyList.of(3,4,5,6)
μ°Έ νμ μ μ΄ κ³ λ§.
ν©ν 리 ν¨μ λͺ κ·μ½
from : νλΌλ―Έν°λ₯Ό νλ λ°κ³ , ν΄λΉ νμ μ μΈμ€ν΄μ€ νλ return
val date = Date.from(instatnt)
of : νλΌλ―Έν°λ₯Ό μ¬λ¬ κ° λ°κ³ , ν΅ν©νμ¬ μΈμ€ν΄μ€λ₯Ό return
val cards : Set <Rank> = EnumSet.of(JACK, QUEEN, KING)
valueOf : from, ofμ λΉμ·ν¨. μλ―Έλ₯Ό μ‘°κΈ λ μ½κ² μ½μ μ μλ ν¨μ
val prime : BigInteger = BigInteger.valueOf(Integer.MAX_VALUE)
instance, getInstance : μ±κΈν΄ μΈμ€ν΄μ€ νλλ₯Ό return
val connection = Connection.getInstance(parameter)
createInstance, newInstance : getInstanceμ λμΌ, μ±κΈν΄μ΄ μλ. νΈμΆν λλ§λ€ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό return
val newPerson = Person.newInstance(age, name)
getType : getInstanceμ λμΌ, ν©ν 리 ν¨μκ° λ€λ₯Έ ν΄λμ€μ μμ λ μ¬μ©, νμ μ ν©ν 리 ν¨μμμ return νλ νμ
val fs: FileStore = Files.getFileStore(path)
newType : newInstanceμ λμΌ,
val br : BufferedReader = Files.newBufferedReader(path)
μ΄μ κ°μ΄ κ·μ½μ μ§ν€λ©° λ§λ€λ©΄ μ’μ κ² κ°λ€.
λμ²λΌ μ½νλ¦° μ λ¬Έν μ§ μΌλ§ λμ§ μμ κ°λ°μλ μ½νλ¦°μ companion objectλ₯Ό staticμ²λΌ μ¬μ©νλ κ²½ν₯μ΄ μλλ°,
μμ²λΌ c.oλ μμ°ν κ°μ²΄μ΄λ―λ‘ interfaceλ₯Ό μμλ°μ ꡬνν μ μλ€.
μ΄λ₯Ό μ νμ©νμ¬ μΊμ±μ ꡬννκ±°λ ν μ€νΈλ₯Ό μν κ°μ§ κ°μ²΄λ₯Ό μμ±ν μ μμ κ²μ΄λ€.
μ½νλ¦° ν μ ν ꡬνμ μμ£Ό μ°Έκ³ ν΄μ μ¬μ© λ°©λ²μ λͺ νν μ΄ν΄ν΄μΌκ² λ€.
νμ₯ ν©ν 리 ν¨μ
μ΄λ―Έ companion κ°μ²΄κ° μ‘΄μ¬ν λ, μ΄ κ°μ²΄μ ν¨μμ²λΌ μ¬μ©νλ ν©ν 리 ν¨μλ₯Ό λ§λ€ κ²½μ°μ μ¬μ©νλ€.
νμ₯ ν¨μλ₯Ό μ΄μ©ν΄μ!
interface Tool {
companion object {
//....
}
}
fun Tool.Companion.createBigTool(/*...*/) : BigTool {
//...
}
Tool.createBigTool()
μ΄λ° μμΌλ‘ companion κ°μ²΄λ₯Ό μ§μ μμ νμ§ μκ³ , μΈλΆ νμΌμμ νμ₯ ν©ν 리λ₯Ό λ°λ‘ μ μν΄μ μ¬μ©ν μ μλ€.
μ°¨μλ~
λ¬Όλ‘ νμ₯νλ €λ©΄ νμ₯μ²μ companionμ΄ μ μλμ΄ μμ΄μΌκ² λ€.
ν±λ 벨 ν©ν 리 ν¨μ
λνμ μΈ μμλ‘, mapof, listof, setof λ±μ΄ μλ€.
κ°λ Ή listof(1,2,3) μ΄ κΈ°μ‘΄ List.of(1,2,3) λ³΄λ€ κ°λ μ±μ΄ ν¨μ¬ μ’κΈ° λλ¬Έμ, ν±λ 벨 ν¨μλ₯Ό μ¬μ©νλ€.
νμ§λ§, ν±λ 벨 ν¨μλ₯Ό λ§λ€ λ ν¨μμ μ΄λ¦μ ν΄λμ€ λ©μλ μ΄λ¦μ²λΌ μ§μ§ λ§μ.
μ μ€νκ² μκ°ν΄μ μ΄λ¦μ μ§μ νμ.
κ°μ§ μμ±μ
class A
val A = A()
μ½νλ¦°μ μμ±μλ ν±λ 벨 ν¨μμ κ°μ ννμ΄λ€.
ν±λ 벨 ν¨μμ²λΌ μμ±μ ν¨μλ μ°Έμ‘°ν μ μλ€.
val reference: () -> A = ::A
μΌλ°μ μΌλ‘ μμ±μμ ν¨μλ₯Ό ꡬλΆμ§λ λ°©λ²μ λλ¬Έμ μμ μ 무μ΄λ€.
νμ§λ§,
List(4) ??
μΈν°νμ΄μ€κ° μ΄λ»κ² μμ±μλ₯Ό κ°μ§μ§?
μ½νλ¦°μ΄ μ 곡νλ λΌμ΄λΈλ¬λ¦¬μμλ κ°λ₯νλ€.
μ΄λ¬ν ν±λ 벨 ν¨μλ μμ±μμ²λΌ 보μ΄κ³ , μμ±μμ²λΌ μλνλ€.
κ·Έμ λμμ ν©ν 리 ν¨μμ μ΄μ μ κ°λλ€.
μ΄κ²λ μμ°ν ν©ν 리 ν¨μμ΄λ―λ‘, κ°μ§ μμ±μλΌ λΆλ¦¬μ΄λ€.
λ°κ²,
μΈν°νμ΄μ€λ₯Ό μν μμ±μλ₯Ό λ§λ€κ³ μΆμ κ²½μ°
refied νμ μΈμλ₯Ό κ°κ² νκ³ μΆμ κ²½μ°
μμ±νλ€.
μ 리
ν©ν 리 ν¨μλ₯Ό λ§λ€ μ μλ λ€μν λ°©λ²λ€μ νΉμ§μ λͺ νν μ΄ν΄νκ³ μ¬μ©νμ.
κ°μ₯ μΌλ°μ μΈ λ°©λ²μ companion object λ₯Ό μ΄μ©νλ λ°©λ²μ΄λ€.
μλ°μ μ μ ν©ν 리 λ©μλ ν¨ν΄κ³Ό μ μ¬νκ³ μμ νκ³ μ΅μνκ² μ½νλ¦°μ΄ κ³μΉνκΈ° λλ¬Έμ΄λ€.