티스토리 뷰
728x90
- 객체 선언
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 |