티스토리 뷰

app/kotlin

[kotlin/코틀린] 객체

hrniin 2023. 6. 22. 22:53
728x90

 

  1. 객체 선언
object Application {
    val name = "My Application"
    override fun toString() = name
}

fun describe(app: Application) = app.name   // Application을 타입으로 사용

fun main() {
    println(describe(Application))            // Application을 값으로 사용
    println(Application)
}
  • 객체를 통해 클래스의 인스턴스가 하나만 존재하는 싱글톤 패턴을 사용할 수 있다.
  • object 키워드를 사용하여 선언한다. 
  • 객체의 인스턴스가 하나뿐이므로 객체를 타입으로도 사용할 수 있다.
  • 실제 객체 인스턴스에 접근할 때까지 초기화가 지연된다.
  • 생성자가 존재하지 않는다. (암시적으로 인스턴스가 생성되기 때문)
  • 객체 내 클래스에는 inner 키워드를 사용할 수 없다. (inner 클래스는 바깥쪽 인스턴스와 연관되는데, 객체는 인스턴스가 하나뿐임)

 

 

object Outer {
    val name = "Outer"
   
    object Inner {
        val name = "Inner"
        override fun toString() = "${Outer.name} $name"
    }
}

fun main() {
    println(Outer.Inner)
}
  • 클래스나 객체 내에 내포될 수 있다. 
  • 함수, 지역 클래스, 내부 클래스 내에 선언할 수 없다. (외부 문맥에 의존하므로 싱글톤이 될 수 없음) 

 

 

 

       2. 동반 객체

class Application private constructor(val name: String) {
    companion object Factory {
        fun create(s: String): Application {
            val name = s
            return Application(name)
        }
    }
}

fun main() {
    val app = Application.create("My Application")
    println("Application started: ${app.name}")
}
 
  • companion 키워드를 사용한 내포 객체를 뜻한다.
  • 외부 클래스 이름만을 사용해 동반 객체에 접근할 수 있다.
  • 동반 객체의 이름을 생략할 수 있다. 디폴트 이름으로 Companion이 된다.
  • 클래스 내에 동반 객체가 둘이상 있을 수 없다.
  • 최상위 객체, 다른 객체의 내포된 객체에 동반 객체를 생성할 수 없다.

 

 

 

       3. 객체 식

fun main() {
    fun midPoint(xRange: IntRange, yRange: IntRange) = object {
        val x = (xRange.first + xRange.last) / 2
        val y = (yRange.first + yRange.last) / 2
    }
     
    val midPoint = midPoint(1..5, 2..6)
    println("${midPoint.x}, ${midPoint.y}")
}
  • 선언 없이 객체를 바로 생성할 수 있다.
  • 익명 객체 타입이 반환된다.
  • 최상위에 정의할 수 없다. 객체 식의 멤버에 접근할 때 오류가 발생한다. 

 

 

fun main() {
    var x = 1
     
    val o = object {
      val a = x++
    }
     
    println("x = $x") // 2
    println("o.a = ${o.a}")
}
  • 객체 식도 자신을 둘러싼 코드 영역의 값에 접근하고 변경할 수 있다.
  • 지연 초기화되는 객체 선언과 달리, 객체 인스턴스가 생성된 직후 바로 초기화 된다.

 

 

       4. object ↔ companion object

  • object
    • 클래스 전체가 하나의 싱글톤 객체로 선언된다.
    • 객체가 사용될 때 초기화된다.

 

  • companion object
    • 클래스 내 일부분이 싱글톤 객체로 선언된다.
    • 클래스의 인스턴스를 생성하지 않고 클래스를 접근하고자 할 때 사용한다.
    • 객체가 속한 클래스가 사용될 때 초기화된다.

 

 

 

728x90

'app > kotlin' 카테고리의 다른 글

[kotlin/코틀린] 확장  (0) 2023.07.19
[kotlin/코틀린] 고차 함수  (0) 2023.07.19
[kotlin/코틀린] 프로퍼티  (0) 2023.06.22
[kotlin/코틀린] 널 가능성  (0) 2023.06.22
[kotlin/코틀린] 클래스 정의하기  (0) 2023.06.22
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함