기록

[코틀린/Kotlin] Object, Companion Object 본문

[Study]/Kotlin

[코틀린/Kotlin] Object, Companion Object

Dannnnnn 2022. 5. 8. 02:57
반응형

1. Object

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

var a = Person("박보영", 1990)

 

여러개의 인스턴스가 필요하지 않고 단 하나의 객체만으로 공통적인 속성과 함수를 사용해야 하는 코드에서는 굳이 Class를 쓸 필요없이 object를 사용하면 된다.

 

object는 생성자 없이 객체를 만들어내며, Singleton Pattern을 언어차원에서 지원하는 것이다.

(Singleton Pattern : 클래스의 인스턴스를 단 하나만 만들어 사용하도록 하는 코딩 아키텍처 패턴)

 

object는 인스턴스를 생성하지 않고 그 자체로 객체이기 때문에 생성자는 사용하지 않는다.

별도의 인스턴스를 생성하지 않기 때문에 object 이름에 직접 참조연산자를 붙여 사용한다.

fun main() {
    
    println(Counter.count)
    
    Counter.countUp()
    Counter.countUp()
    
    println(Counter.count)
    
    Counter.clear()
    
    println(Counter.count)
}

object Counter {
    var count = 0
    
    fun countUp() {
        count++
    }
    
    fun clear() {
        count = 0
    }
}

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

 

 

2. Companion object 

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

이를 이용하면 기존 클래스 안에도 object를 만들 수 있다.

 

기능적으로는 기존의 언어들이 가진 Static 멤버와 비슷하다.

(Static 멤버 : 클래스 내부에서 별도의 영역에 고정적으로 존재하여 인스턴스를 생성하지 않아도 공용으로 사용가능한 속성이나 함수)

fun main() {
    var a = FoodPoll("짜장")
    var b = FoodPoll("짬뽕")
    
    a.vote()
    a.vote()
    
    b.vote()
    b.vote()
    b.vote()
    
    println("${a.name} : ${a.count}")
    println("${b.name} : ${b.count}")
    println("총계 : ${}")
}

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

서로 다른 인스턴스임에도 companion object 내에 있는 total을 공유하고 있기 때문에 모든 인스턴스에서 투표수를 누적할 수 있다.

 

 

 

https://www.youtube.com/watch?v=q7GV68jKLVM&list=PLQdnHjXZyYadiw5aV3p6DwUdXV2bZuhlN&index=16

위 강의를 보면서 개인적으로 공부한 내용을 정리하였습니다.

반응형