안드로이드(Kotlin)

Kotlin 코틀린의 object VS companion object

영드로이드개발자 2022. 8. 30. 15:34
반응형

object VS companion object

 

코틀린은 싱글톤 클래스를 생성하기 위해 object declaration이라는 것을 사용한다.

싱글톤 클래스로 선언해야 할 경우에 클래스 명 앞에 class 대신 object를 사용함으로써 싱글톤 클래스를 생성하게 된다.

 

하지만 공부를 하다보면 companio object라는 것을 볼 수 있다.

object와 companion object는 무엇이 다른지 알아보자.

 

1. object

object는 크게 2가지로 사용된다.

1. object expression (객체 표현식)

 

2. object declaration (객체 선언) 

    - 동반 객체(객체 선언을 클래스 내부에 사용한 것)

 

여기서 싱글톤 클래스를 생성하기 위해 사용되는 object의 쓰임은 2번째인 object declaration (객체 선언)이다.

그리고 이제 여기서 object와 companion object를 사용할 수 있는데 하나씩 알아보자.

 

2. object VS companion object

2-1 object

코틀린에서는 클래스 이름앞에 object 키워드를 붙이면 싱글톤 클래스를 만들수 있다.

하지만 이때는 생성자를 호출하지 않는 클래스에서만 사용할 수 있다.

object는 싱글톤 객체이기 때문에 생성자 자체를 사용할 수 없다.

개발자가 원하는 시점에 인스턴스를 생성하는 방식이 아니기 때문에 생성자 파마리터를 전달할 수 도 없기 때문이다.

import android.util.Log

// 싱글톤 클래스를 만들려면 앞에 object 를 붙이면 된다.
object MyObjectSingleton {
    fun printMsg(msg: String) {
        Log.d("MyObjectSingleton", "msg: $msg")
    }
}

 

 

2-2 companion object

코틀린에는 기본적으로 static이 존재하지 않는다. 그에 따라 companion object를 통해 package수준의 최상위 함수와 객체선언을 사용할 수 있다.

 

* 최상위 함수 : Static 메소드를 대신할 수 있는 함수

* 객체선언 : 최상위 함수가 접근할 수 없는 클래스 안에 있는 private 멤버변수에 접근할때 사용하는 객체

 

package com.example.part3_chapter4

class A private constructor(val name: String) { // 클래스 A의 주 생성자는 private로 접근을 제한
    companion object{
        val a = "ddddd"
        fun bar(): A{
            return A("ZERO") //companion object의 bar() 메서드를 통해 private 생성자에 접근 할 수 있다.
        }
    }
}

class B{
    var a = A("ZERO") // 실패, 주 생성자는 private 접근제한자로 설정되어 호출 할 수 없다.
    var b = A.bar()         // 성공, 동반객체의 bar() 메서드를 통해 private 주 생성자에 접근이 가능하다.
}

 

*중요

1. 클래스 내에는 companion object를 오직 딱 하나만 선언할 수 있다.

 

2.  companion object는 static클래스변수가 아니라 object 객체이다.

 

 

따라서 클래스명.Companion.변수 의 형태로 사용할 수 있다.

즉 companion object는 클래스가 메모리에 적재되면서 함께 생성되는 동반객체인 것이다.

그래서 클래스명.Companion.변수 로 접근할 수 있는 것이고, 이에 대한 축약표현이 단지 클래스명.변수 이기때문에 단순히 static클래스 변수라고 착각이 드는 것이다.

 

 

반응형