본문 바로가기

Language/Kotlin

[Kotlin] 오브젝트

728x90
반응형

Object

: 생성자 없이 객체를 직접 만들어 냄

기존에 배웠던 class는 단지 인스턴스 객체를 만들기 위한 틀이기 때문에 내부에 있는 속성이나 함수를 사용하려면 생성자를 통해 실체가 되는 인스턴스 객체를 만들어야 했다.

그러나 여러 개의 인스턴스 객체가 필요하지 않으며 단 하나의 객체만으로 공통적인 속성과 함수를 사용해야하는 코드에서는 class를 쓸 필요 없이 Object를 사용하면 된다. (Singleton Pattern을 언어 차원에서 지원하는 것)

fun main(){
    println(Counter.count)  // 0

    Counter.countUp()
    Counter.countUp()

    println(Counter.count)  // 2

    Counter.clear()

    println(Counter.count)  // 0
}

object Counter{
    var count = 0

    fun countUp(){
        count++
    }

    fun clear(){
        count = 0
    }
}

object로 선언된 객체는 최초 사용 시 자동으로 생성되며 이후에는 코드 전체에서 공용으로 사용될 수 있으므로 프로그램이 종료되기 전까지 공통적으로 사용할 내용들을 묶어 만드는 것이 좋다.

Companion Object

: 클래스의 인스턴스 기능은 그대로 사용하면서 인스턴스 간에 공용으로 사용할 속성과 함수를 별도로 만드는 것

기능적으로는 기존의 언어들이 가진 static 멤버(클래스 내부에서 별도의 영역에 고정적으로 존재하여 인스턴스를 생성하지 않아도 공용으로 사용 가능한 속성이나 함수)와 비슷

// 짜장과 짬뽕 중 어느 것이 좋은지 투표
// 개별적인 투표수와 총 투표수 동시 집계

fun main(){
    var a = FoodPoll("짜장")
    var b = FoodPool("짬뽕")

    a.vote()
    a.vote()

    b.vote()
    b.vote()
    b.vote()

    println("${a.name} : ${a.count}")  // 짜장 : 2
    println("${b.name} : ${b.count}")  // 짬뽕 : 3
    println("총계 : ${FoodPoll.total}")  // 총계 : 5
}

class FoodPoll(val name: String){
    companion object{
        var total = 0
    }

    var count = 0

    fun vote(){
        total++
        count++
    }
}
728x90
반응형

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

[Kotlin] 클래스의 다형성  (0) 2023.09.10
[Kotlin] 익명객체와 옵저버 패턴  (0) 2023.09.09
[Kotlin] 스코프 함수  (0) 2023.09.07
[Kotlin] 고차함수와 람다함수  (0) 2023.09.07
[Kotlin] 스코프와 접근제한자  (0) 2023.09.06