kotlinμ μ¬μ©νλ©΄μ λΆνΈνλ(νΉμ μ΅μμΉ μμλ
) λΆλΆμ΄ 3κ°μ§ μ λ μμλλ°μ.
- Nullable,
- singleton(
default final
) - static
μ λ΄μ© μ€, static μ κ΄νμ¬, μ kotlinμ΄ static μ μ§μνμ§ μλμ§
νΉμ μ μ¬νκ² λ§λ€λ €λ©΄ μ΄λ»κ²ν΄μΌνλμ§
λ₯Ό μ 리ν΄λ³΄λ €ν©λλ€.
- kotlin μμλ singleton μ μΈμ΄μμ μ§μν©λλ€.
- sigleton μ 보μ₯νλ
object
keyword
- sigleton μ 보μ₯νλ
object HelloWorld {
fun helloWorld() = "helloWorld"
}
μμ²λΌ μ μΈνκ³ μ νλ class μ object keyword λ₯Ό λμ μ¬μ©ν κ²½μ°, java μμλ μλμ²λΌ ννλ©λλ€.
public final class HelloWorld {
@NotNull
public static final HelloWorld INSTANCE;
@NotNull
public final String helloWorld() {
return "helloWorld";
}
private HelloWorld() {
}
static {
HelloWorld var0 = new HelloWorld();
INSTANCE = var0;
}
}
static finalλ‘ κ°μ²΄λ₯Ό μ μΈνκ³ , static block μ μ¬μ©ν΄ μ΄κΈ°νλ₯Ό ν©λλ€.
νν λ³Ό μ μλ singleton patternμ ννμ λλ€.
public static final
λ‘ κ°μ²΄λ₯Ό μ μΈλμ΄, kotlin μμ μλμ²λΌ μ¬μ©ν μ μμ΅λλ€.
@Test
fun helloWorldTest() {
val expect = "helloWorld"
assertEquals(expect, HelloWorld.helloWorld())
}
static method μ μ μ¬νκ² μ¬μ© ν μ μμΌλ©°, Java λ‘ λ³ν ν κ²½μ° μλμ²λΌ μ¬μ©ν μ μμ΅λλ€.
HelloWorld.INSTANCE.helloWorld()
μ£Όμ : singleton μΌλ‘ μΈν΄ static
μ²λΌ
μΈ μ μλκ²μ΄μ§, static μ΄ μλλλ€.
λν object
λ singleton μν μΈμλ, μ΅λͺ
ν΄λμ€λ₯Ό λ§λλ keyword μ΄κΈ°λν©λλ€.
val typeReference = object : TypeReference<List<String>>() {}
μμ μ€λͺ νλ―, kotlin μλ static ν¨μ/λ³μλ₯Ό μ§μνμ§ μμ΅λλ€. static κ³Ό μ μ¬νκ² μ¬μ©νκΈ° μν΄μ, companion object λΌλ keywordλ₯Ό μ¬μ© ν μ μμ΅λλ€. λ€λ§, μ μ¬νκ² λμν λΏ μ€μ λ‘ static μΌλ‘ μμ±λμ§ μμ΅λλ€.
class Hello {
companion object {
fun hello() = "hello"
}
}
class World {
fun world() = Hello.hello()
}
java λ‘ λ³ν
public final class Hello {
@NotNull
public static final Hello.Companion Companion = new Hello.Companion((DefaultConstructorMarker)null);
public static final class Companion {
// code
}
}
nested class λ‘ Companionμ΄λΌλ μ΄λ¦μ class λ₯Ό μ μΈνκ³ , μ΄λ₯Ό κ°μ²΄λ‘ μ΄κΈ°ννμ¬ λ΄λΆ λ³μλ‘ λ€κ³ μλ ꡬ쑰μ λλ€.
The main advantage of this is that everything is an object.
link
kotlin μμ static μ μ§μνμ§ μλ κ°μ₯ ν° μ΄μ λ, static member κ° object(κ°μ²΄
) λ‘ μ·¨κΈλμ§ μκΈ° λλ¬Έμ
λλ€.
object λ‘ μ·¨κΈλμ§ μλλ€λ 건, μμμ μ΄μ©ν μ μκ³ , parameter λ‘ μ λ¬λ μ μμΌλ©°, instance Map λ±μ νμ©ν μ μλ€λ κ²μ μλ―Έν©λλ€.
first citizen μ΄ μλλΌλ μλ―Έμ£
interface KeyGenerator {
fun generate() : String
}
class Hello{
companion object : KeyGenerator {
override fun generate(): String = "this object key"
}
}
κ°μ²΄μ μν μ΄ μλ, μ νΈμ±(?) Interface λ₯Ό μλμ²λΌ λΆλ¦¬ν΄μ μ¬μ©νλ©΄ κ½€ μ μ©ν κ±° κ°μλ°μ. μ νΈμ±μΌλ‘λ μλμ²λΌ μ¬μ© ν μ μμ΅λλ€.
// logger μ μΈ
interface Log {
fun logger() = LoggerFactory.getLogger(this.javaClass)
}
class MyBusiness{
// companion μΌλ‘ log μμ
companion object : Log
fun hello(str:String) {
logger.info("hello $str")
}
}
μμ²λΌ μμ£Ό μ¬μ©λλ κ³΅ν΅ μ νΈλ€μ, object μμμ μ΄μ©ν΄ νΈνκ² μ¬μ©ν μ μμ΅λλ€ :)
- Companion keyword λ₯Ό μ¬μ©νμ§μκ³ , μΆμ½νμ¬ μ¬μ©κ°λ₯ν©λλ€. (1)
class Parent {
companion object {
val target = "json"
val version = 1.0
}
}
// test class
@Test
@DisplayName("(1) Companion keyword λ₯Ό μ¬μ©νμ§μκ³ , μΆμ½νμ¬ μ¬μ©κ°λ₯ν©λλ€.")
fun shortcut() {
val expect = Parent.Companion.target
assertEquals(expect, Parent.target)
val expectType = Parent
assertTrue("class ν λΉ μ, companion μ λ°λΌλ΄
λλ€.", expectType is Parent.Companion)
}
- Companion μ μ΄λ¦μ μ§μ μ μμΌλ©°, Interface μλ μ μΈν μ μμ΅λλ€.
- μ΄λ¦μ μ§μ κ²½μ°, μΆμ½μ κ·Έλλ‘ μ¬μ©ν μ μμΌλ,
Parent.Companion.target
μParent.${CompanionName}.target
μΌλ‘ μ¬μ©ν΄μΌ ν©λλ€. - Companion μ λ± νλλ§ μ¬μ© ν μ μμ΅λλ€.
interface Parent {
companion object AppVersion {
val target = "json"
val version = 1.0
}
companion object { // error !!
}
}
- java λ‘ λ³ν μ, static κ°μ²΄λ‘ μ μλ¨μΌλ‘ μΈλΆ class μμλ μ κ·Ό κ°λ₯ν©λλ€.
- companion μ private μΌλ‘ μ€μ μ μ κ·Ό λΆκ°ν©λλ€.
- κ°μ²΄ μμ μ, companion μ μμλμ§ μμ΅λλ€.
- class ν¨μμμ companion λ³μλ₯Ό μ¬μ©ν μ μμ΅λλ€.
- companion μμ class propertyλ μ¬μ© λΆκ°ν©λλ€. (companion μ static κ°μ²΄ μ λλ€.)
open class Parent {
companion object {
val target = "json"
val version = 1.0
}
open fun getTarget(): String = Companion.target
}
class Child : Parent() {
companion object {
val target = "html"
val version = 1.0
}
// Companion μΆμ½ κ°λ₯νμ§λ§, μ΄ν΄λ₯Ό λκΈ°μν΄ λ¨κ²¨λ‘λλ€.
override fun getTarget() = Companion.target
}
@Test
@DisplayName("(4) λ€νμ±μ μ΄μ©ν μ μμ΅λλ€. (companion μ νΉμ§μ μλ) ")
fun polymorphism() {
val child:Parent = Child()
// companion μ νΉμ§μ μλμ§λ§, μ΄λ κ² μ¬μ©ν μ λ μμκ±° κ°λ€μ :)
assertEquals(Child.Companion.target, child.getTarget())
}
κ°μΈμ μΈ μκ° :: java κ°λ°μ κ΄μ (?)μμ λ΄€μλ companion μ κ·Έλ₯ static object λ‘ λ³΄μ΄λλ°,
μ‘°κΈ λ μ°μν μ¬μ©μ²κ° μμκΉ?
κΆκΈν©λλ€ :)
Why is there no static keyword in Kotlin?
[kotlin] Companion Object (1) β μλ°μ staticκ³Ό κ°μ κ²μΈκ°?