프로그래밍 언어/Kotlin

[Kotlin] 객체

happy_life 2022. 10. 13. 08:48

객체는 오직 하나의 인스턴스만 존재하는 클래스는 object 키워드로 정의하며 객체라고 부릅니다. 객체에는 여러 종류가 있습니다. 이는 기존의 java와 큰 차이가 있는 부분이므로 이번 포스팅에서 정리해보려고 합니다.

 

객체

오직 하나의 인스턴스만 존재하는 클래스로 object라는 키워드로 정의하며 객체라고 부릅니다. 이러한 객체는 선언과 동시에 인스턴스가 생성됩니다.

object Application {
    val name = "My Application"
    override fun toString() = name
}

object

 

 

 

내포 객체

특정 클래스의 모든 인스턴스가 공유하는 객체를 의미합니다. 팩토리 디자인 패턴이 그 예라고 할 수 있습니다.

class Application private constructor(val name: String){
    object Factory {
        fun create(args: Array<String>): Application? {
            val name = args.firstOrNull() ?:return null
            return Application(name)
        }
    }
    override fun toString() = name
}

fun main () {
    val app = Application.Factory.create(arrayOf("My Application"))
    print(app)
}

내포 객체

 

 

 

동반 객체

앞의 예제에서는 Factory라는 내부 객체명을 매번 명시해야합니다. 하지만 companion object로 선언하면 이를 생략할 수 있습니다.

class Application private constructor(val name: String) {
    companion object {
        fun create(args: Array<String>): Application? {
                val name = args.firstOrNull() ?: return null
                return Application(name)
        }
    }
    override fun toString() = name
}

fun main () {
    val a = Application.create(arrayOf("My Application"))
    println(a)
}

 

 

 

익명 객체

익명의 객체를 프로그램 흐름에 생성하고자 할 때도 object를 사용합니다. 기존의 object와는 약간 개념이 다른데, 클래스를 정의하고 사용하기 복잡하니, 이를 간단하게 하기 위해 사용하는 것이라고 보면 됩니다. 

fun main () {
    fun midPoint(xRange: IntRange, yRange: IntRange) = object {
        val x = (xRange.first + yRange.last) / 2
        val y = (yRange.first + yRange.last) / 2
    }

    val midA = midPoint(1..3, 3..7)
    println("${midA.x}, ${midA.y}")
}

 

익명 객체를 선언하는 함수를 함수 밖으로 빼면 필드를 인식할 수 없습니다. 따라서 밖에서 사용하려면 private을 붙여줘야 합니다.

인식 X / private으로 해결

 

 

'프로그래밍 언어 > Kotlin' 카테고리의 다른 글

[Kotlin] 프로퍼티  (0) 2022.10.11
[Kotlin] null 정리  (0) 2022.10.11
[Kotlin] 코틀린 클래스, 생성자  (0) 2022.10.09
[Kotlin] 코틀린 함수  (1) 2022.10.08
[Kotlin] 코틀린 문자열과 배열  (1) 2022.10.08