본문 바로가기
Kotlin 공부 노트

코틀린의 오브젝트란? (object, companion object)

by 지게요 2022. 2. 17.
728x90
반응형

개발을 하다 보면 싱글톤 패턴을 구현하기 위해 object를 사용하기도 한다. 평소에 잘 모르고 지나갔지만 이번에는 object에 관해 알아보겠다. 

# object

object로 클래스를 정의하면 클래스 선언과 동시에 객체가 생성됨으로써 싱글톤 패턴이 적용되어 객체가 한 번만 생성이 된다.

# object class 특징

1. object class 는 클래스 객체 생성 없이 즉시, 접근 가능한 클래스이다.

2. object class 는 생성자를 갖지 않는다.

3. object class 는 어느 클래스, 함수에서든 별도의 객체화 과정 없이 접근 가능하다.

4. object class 는 프로그램이 실행되는 동안 저장된 데이터는 손실되지 않는다.

5. object class 는 코틀린에 static이 없다는 것을 대체해 사용할 수 있는 클래스이다.

6. 안드로이드에서는 액티비티, 프래그먼트를 구분하지 않고 데이터 전달을 할 수 있다. (앱 실행 중인 동안 지속 보관)

# object class 사용법

// object class인 Counter 생성 
object Counter{
    var count = 0
    
    fun countUp(){
        count++
    }
    
    fun clear(){
        count = 0
    }
}

fun main() {
    println(Counter.count)
    
    // 별도의 인스턴스를 생성하지 않아서 object이름에 참조연산자를 붙여 사용
    Counter.countUp() 
    Counter.countUp()
    
    println(Counter.count)
    
    Counter.clear()
    
    println(Counter.count)

}

// 출력 값
// 0
// 2
// 0

 

# companion object

동반 객체라고도 하며 클래스 안에도 object를 만드는것이 companion object이다. 자바에서는 static 멤버와 비슷하다고 생각하면 된다.

# companion object 특징

1. static처럼 동작할 뿐 사실 static이 아닌 객체이다 (Companion 키워드로 접근 가능)

2. 클래스 내 딱 하나만 쓸 수 있다.

3. 인터페이스 내에도 정의할 수 있다.

4. 상속 관계에서 companion 멤버는 가려진다.

# companion object  사용법

짜장과 짬뽕중에 투표를 해서 count와 total을 구하는 예제를 해보겠다.

class FoodName(val name : String){
   // companion object 생성해 공유 객체 total 생성
    companion object{
        var total = 0
    }
     var count = 0
    
    fun countUp(){
        total++
        count++
    }
}

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

}

// 출력 값
// 짜장 : 2
// 짬뽕 : 3
// 총계 : 5

출력 값에서 나오듯 서로 다른 인스턴스인데 companion object에서 total 변수를 생성해 줬기 때문에 total은 공유가 돼서 올라간다.

반응형