1. κ°œμš”

μžλ°”μ˜ static 은 μ–Έμ–΄ λ¬Έλ²•μ΄μž νŠΉλ³„ μ·¨κΈ‰λ˜λŠ” 멀버닀. μ½”ν‹€λ¦°μ—” static ν‚€μ›Œλ“œκ°€ μ—†λ‹€. λŒ€μ‹  object λΌλŠ”, κ·Έ 자체둜 ν•˜λ‚˜μ˜ 클래슀이자 μΈμŠ€ν„΄μŠ€μΈ κ°œλ…μ΄ μžˆλ‹€. μ™œ μ΄λ ‡κ²Œ κ°ˆλžλŠ”μ§€, companion object κ°€ static 을 μ–΄λ–»κ²Œ λŒ€μ²΄ν•˜λŠ”μ§€, 그리고 이 섀계가 μ‹€μ œλ‘œ μ£ΌλŠ” 것을 λ³Έλ‹€.


2. 핡심 λ‚΄μš©

2-1. object β€” μ–Έμ–΄κ°€ μ§€μ›ν•˜λŠ” 싱글톀

object Database {
    private val connections = mutableListOf<Connection>()
    fun connect(): Connection { ... }
}
 
Database.connect()

object 둜 μ„ μ–Έν•˜λ©΄ 클래슀 μ •μ˜μ™€ λ™μ‹œμ— μΈμŠ€ν„΄μŠ€κ°€ λ”± ν•˜λ‚˜ 생긴닀. μžλ°”μ—μ„œ 싱글톀을 λ§Œλ“€λ €λ©΄ private μƒμ„±μž, private static ν•„λ“œ, getInstance() λ₯Ό μ†μœΌλ‘œ λ§žμΆ”κ³  μŠ€λ ˆλ“œ μ•ˆμ „μ„±κΉŒμ§€ μ‹ κ²½ 써야 ν•œλ‹€(이 방식엔 이쀑 검사 락킹 같은 함정도 λ”°λΌμ˜¨λ‹€). 코틀린은 object ν‚€μ›Œλ“œ ν•˜λ‚˜λ‘œ 이걸 μ–Έμ–΄κ°€ 보μž₯ν•œλ‹€. μ΄ˆκΈ°ν™”λŠ” μŠ€λ ˆλ“œ μ•ˆμ „ν•˜κ²Œ, 졜초 μ ‘κ·Ό μ‹œμ μ— μ§€μ—° μƒμ„±λœλ‹€.

2-2. static 이 μ—†λŠ” 이유

μžλ°”μ˜ static λ©€λ²„λŠ” ν΄λž˜μŠ€μ— μ†ν•˜λ©΄μ„œ μΈμŠ€ν„΄μŠ€μ™€λŠ” λ¬΄κ΄€ν•˜λ‹€. 이 μ–΄μ€‘κ°„ν•œ μœ„μΉ˜κ°€ λ¬Έμ œμ˜€λ‹€. static λ©”μ„œλ“œλŠ” λ‹€ν˜•μ„±μ΄ μ—†κ³ (μ˜€λ²„λΌμ΄λ”© μ•ˆ 됨), μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„λ„ λͺ» ν•˜κ³ , λͺ©ν‚Ήν•˜κΈ°λ„ κΉŒλ‹€λ‘­λ‹€. 코틀린은 β€œν΄λž˜μŠ€μ— μ†ν•˜μ§€λ§Œ μΈμŠ€ν„΄μŠ€λŠ” μ•„λ‹Œ 멀버” λΌλŠ” κ°œλ… 자체λ₯Ό μ—†μ• κ³ , λŒ€μ‹  object λŠ” μ˜¨μ „ν•œ 객체둜 λ§Œλ“€μ—ˆλ‹€. object λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  수 있고, λ‹€λ₯Έ 클래슀λ₯Ό 상속할 수 있고, ν•„μš”ν•˜λ©΄ κ·Έ 자체둜 κ°’μ²˜λŸΌ 전달할 수 μžˆλ‹€. static 이 κ°€μ§„ μ œμ•½μ΄ μ• μ΄ˆμ— μ—†λ‹€.

2-3. companion object β€” 클래슀 μ•ˆμ˜ 정적 멀버 자리

static 이 ν•˜λ˜ 일, 즉 β€œν΄λž˜μŠ€ μ΄λ¦„μœΌλ‘œ λ°”λ‘œ μ ‘κ·Όν•˜λŠ” 멀버” κ°€ ν•„μš”ν•  λ•Œκ°€ μžˆλ‹€. νŒ©ν† λ¦¬ λ©”μ„œλ“œ, μƒμˆ˜ 등이닀. 코틀린은 클래슀 μ•ˆμ— companion object λ₯Ό ν•˜λ‚˜ λ‘˜ 수 있게 ν–ˆλ‹€.

class User private constructor(val id: Long, val name: String) {
    companion object {
        const val MAX_NAME_LENGTH = 50
 
        fun create(name: String): User {
            require(name.length <= MAX_NAME_LENGTH)
            return User(generateId(), name)
        }
    }
}
 
User.create("junho")

User.create(...), User.MAX_NAME_LENGTH 처럼 클래슀 μ΄λ¦„μœΌλ‘œ λ°”λ‘œ μ ‘κ·Όν•œλ‹€λŠ” 점은 static κ³Ό κ°™μ•„ 보인닀. ν•˜μ§€λ§Œ companion object λŠ” 싀체가 μžˆλŠ” 객체닀. User.Companion μ΄λΌλŠ” μ΄λ¦„μœΌλ‘œ μ°Έμ‘°ν•  수 있고, μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„μ‹œν‚¬ 수 μžˆλ‹€.

interface Factory<T> { fun create(): T }
 
class Config private constructor() {
    companion object : Factory<Config> {
        override fun create() = Config()
    }
}

static 은 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  수 μ—†μ–΄ μžλ°”μ—μ„œλŠ” 이런 νŒ¨ν„΄μ΄ μ•ˆ λœλ‹€. companion object λŠ” 객체이기 λ•Œλ¬Έμ— κ°€λŠ₯ν•˜λ‹€. νŒ©ν† λ¦¬ νŒ¨ν„΄μ„ μ œλ„€λ¦­ν•˜κ²Œ λ‹€λ£° 수 μžˆλ‹€λŠ” λœ»μ΄λ‹€.

2-4. 읡λͺ… object β€” 일회용 κ΅¬ν˜„μ²΄

이름 μ—†λŠ” object 도 μžˆλ‹€. μΈν„°νŽ˜μ΄μŠ€λ‚˜ 좔상 클래슀λ₯Ό κ·Έ μžλ¦¬μ—μ„œ 즉석 κ΅¬ν˜„ν•  λ•Œ μ“΄λ‹€.

button.setOnClickListener(object : OnClickListener {
    override fun onClick() { println("clicked") }
})

μžλ°”μ˜ 읡λͺ… ν΄λž˜μŠ€μ™€ 같은 μžλ¦¬μ§€λ§Œ, 이것도 object 라 μ§„μ§œ κ°μ²΄λΌλŠ” 점은 κ°™λ‹€.

2-5. μ£Όμ˜ν•  점 β€” companion object λŠ” ν΄λž˜μŠ€λ‹Ή ν•˜λ‚˜

companion object λŠ” ν΄λž˜μŠ€λ§ˆλ‹€ μ΅œλŒ€ ν•˜λ‚˜λ‹€. μ—¬λŸ¬ static μœ ν‹Έ 그룹을 λ‚˜λˆ„κ³  μ‹ΆμœΌλ©΄ companion object μ•ˆμ— μ—¬λŸ¬ λ©”μ„œλ“œλ₯Ό λ‘κ±°λ‚˜, μ΅œμƒμœ„ ν•¨μˆ˜(파일 레벨 ν•¨μˆ˜)둜 λΉΌλŠ” 게 λ‚«λ‹€. 또 companion object 의 λ©€λ²„λŠ” κ²°κ΅­ κ·Έ ν΄λž˜μŠ€κ°€ λ‘œλ“œλ  λ•Œ ν•¨κ»˜ μ΄ˆκΈ°ν™”λ˜λŠ” 단일 μΈμŠ€ν„΄μŠ€μ˜ 멀버이지, μžλ°”μ²˜λŸΌ 클래슀 메타데이터에 λ°•νžˆλŠ” 것이 μ•„λ‹ˆλΌλŠ” 점도 λ‹€λ₯΄λ‹€. λ¦¬ν”Œλ ‰μ…˜μœΌλ‘œ λ‹€λ£° λ•Œ Companion μ΄λΌλŠ” μ‹€μ œ 객체가 ν•˜λ‚˜ 더 μžˆλ‹€λŠ” κ±Έ μ•Œμ•„μ•Ό ν—·κ°ˆλ¦¬μ§€ μ•ŠλŠ”λ‹€.


3. 마무리

μš”μ•½

  • object λŠ” μ–Έμ–΄κ°€ 보μž₯ν•˜λŠ” 싱글톀이닀. μŠ€λ ˆλ“œ μ•ˆμ „ν•œ μ΄ˆκΈ°ν™”λ₯Ό 직접 κ΅¬ν˜„ν•  ν•„μš”κ°€ μ—†λ‹€.
  • 코틀린에 static 이 μ—†λŠ” μ΄μœ λŠ” β€œμΈμŠ€ν„΄μŠ€ μ•„λ‹Œ 클래슀 멀버” κ°€ λ‹€ν˜•μ„±Β·μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„μ΄ μ•ˆ λ˜λŠ” μ œμ•½μ„ μ—†μ• κΈ° μœ„ν•΄μ„œλ‹€.
  • companion object λŠ” static 자리λ₯Ό λŒ€μ‹ ν•˜μ§€λ§Œ 싀체가 μžˆλŠ” 객체라 μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„, μ°Έμ‘° 전달이 λœλ‹€.
  • 읡λͺ… object λŠ” μΈν„°νŽ˜μ΄μŠ€Β·μΆ”μƒ 클래슀λ₯Ό κ·Έ μžλ¦¬μ—μ„œ 즉석 κ΅¬ν˜„ν•œλ‹€.
  • companion object λŠ” ν΄λž˜μŠ€λ‹Ή ν•˜λ‚˜λΏμ΄λ‹€. μ—¬λŸ¬ 그룹이 ν•„μš”ν•˜λ©΄ μ΅œμƒμœ„ ν•¨μˆ˜λ‘œ λΆ„λ¦¬ν•œλ‹€.