본문 바로가기

Study/Kotlin Study

[Kotlin] 객체 (Object)

+ 항공대학교 김철기 교수님의 객체 지향 프로그래밍 과목 내용를 정리한 글입니다.

객체 (object)

- 오직 하나의 인스턴스만 존재하는 클래스는 object라는 키워드로 정의하며 객체라 부른다.

- 객체는 선언과 동시에 인스턴스가 생성된다. (객체 이름 = 타입 이름 = 인스턴스 이름) 

object Application { // 타입 이름이자 객체 이름
    val name = "My Application"
    override fun toString() = name // 객체의 이름 반환
    // toString 은 이미 상위 클래스에서 사용되고 있으므로 override 사용 (모든 객체는 toString 함수를 갖고 있다.)
    fun exit() {} // 빈 함수
}

fun main() {
     println(Application) // My Application
    // Kotlin에서 객체 호출시 해당 객체의 toString() 함수를 호출하고 출력된다.
}

내부 객체

- 특정 클래스의 모든 인스턴스가 공유하는 객체를 만들 때 내부 객체를 정의하여 사용한다.

class Application private constructor(val name: String){ // 외부에서 생성자 직접 사용 불가
    object Factory {
        fun create(args: Array<String>) : Application? {
            val name = args.firstOrNull() ?: return null
            // firstOrNull: 배열의 첫 번째 요소가 널이 아니라면 첫 요소 반환, 널이라면 null값 반환
            return Application(name)
        }
    }
    override fun toString() = name
}

fun main() {
    val a = Application.Factory.create(arrayOf("My Application")) // 배열로 인자 전달
    // Application 클래스의 객체 Factory의 create 함수를 이용하여 Application 인스턴스 생성
    println(a) // a의 name 출력
}

동반 객체 (companion object)

- 앞의 예제에서 Factory라는 내부 객체명을 매번 명시해야 한다.

=> companion object로 선언하면 내부 객체명을 생략할 수 있다. (java의 static 과 같은 개념)

class Application private constructor(val name: String){
    companion object { // Application 클래스를 대표하는 단독 객체!!
        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를 사용한다.

fun main() {
    fun midPoint(xRange: IntRange, yRange: IntRange) = object {
        // IntRange: 정수 범위 타입
        val x = (xRange.first + xRange.last) / 2
        val y = (yRange.first + yRange.last) / 2
    }
    val midA = midPoint(1 .. 5, 2 .. 6)
    val midB = midPoint(1 .. 8, 30 .. 40)

    println("${midA.x}, ${midA.y}") // 3, 4
    println("${midB.x}, ${midB.y}") // 4. 35
}

- 익명 객체를 사용하는 함수는 단독으로 사용할 수 없다.

 

=> 함수 안에 함수를 정의하거나, private를 사용해야한다.

private fun midPoint(xRange: IntRange, yRange: IntRange) = object {
    // IntRange: 정수 범위 타입
    val x = (xRange.first + xRange.last) / 2
    val y = (yRange.first + yRange.last) / 2
}

fun main() {
    val midA = midPoint(1 .. 5, 2 .. 6)
    val midB = midPoint(1 .. 8, 30 .. 40)

    println("${midA.x}, ${midA.y}") // 3, 4
    println("${midB.x}, ${midB.y}") // 4. 35
}

'Study > Kotlin Study' 카테고리의 다른 글

[Kotlin] 확장  (0) 2023.10.09
[Kotlin] 함수형 프로그래밍  (0) 2023.09.22
[Kotlin] 단순한 변수 이상인 프로퍼티  (0) 2023.09.17
[Kotlin] 널 가능성  (0) 2023.09.12
[Kotlin] 함수  (4) 2023.09.03