[Kotlin] object, companion object

yesjm·2023년 4월 9일
0

오늘은 사용법을 잘 모르고 있었던 Object와 Companion Object에 대해 정리해보고자 한다.
(코드리뷰를 받던중 내가 잘 모르고 사용하고 있다는 사실을 알았다 ㅎㅎ,.)

코틀린에서 object와 companion object는 모두 하나의 인스턴스를 나타내는데 사용되지만, 사용 방법과 범위에 차이가 있다.

object

  1. 싱글톤 패턴 구현

    클래스 이름앞에 class 대신 object 키워드를 붙이면 싱글톤 클래스를 만들 수 있다.

    	object Singleton {
        fun doSomething() {
            // 싱글톤 객체에서 수행할 작업
        }
    }
  2. 객체 생성과 상속 불가

    object는 생성된 객체가 오직 하나뿐이므로 클래스의 인스턴스를 생성하는것과 상속을 지원하지 않는다.

  3. 익명 내부 클래스

    object를 사용하여 익명 내부 클래스를 생성할 수 있다. object는 이름이 없지만, 메서드와 프로퍼티를 포함하는 객체를 생성할 수 있고 이는 코드를 더 간결하고 가독성 높게 만들어준다.

    val listener = object : OnClickListener {
        override fun onClick(view: View) {
            // 클릭 이벤트를 처리하는 코드
        }
    }
  4. 확장 함수와 프로퍼티

    object를 사용하여 클래스나 객체에 화가장 함수나 프로퍼티를 정의할 수 있다.

    object StringUtil {
        fun String.reverse(): String {
            return this.reversed()
        }
    }

companion object

  • companion object는 클래스의 인스턴스가 아니라 클래스 자체에 속하는 객체이다.
  • 자바의 static 키워드를 사용하여 정의하는 정적 멤버를 대체할 수 있다.
  1. 상수

    클래스 내에서 상수를 정의할때 사용할 수 있다. companion object에서 정의한 상수는 클래스 내부에서만 사용할 수 있으며, 클래스 이름으로 접근할 수 있다.

    class MyClass {
        companion object {
            const val MY_CONSTANT = 123
        }
    }
  2. 팩토리 메서드

    팩토리 메서드는 객체를 생성하는 메서드로 클래스 이름을 통해 호출할 수 있다.

    이를 통해 코드를 추상화하여 유지보수성을 높이고, 코드를 쉽게 변경하거나 수정할 수 있도록 한다.

    class MyClass private constructor(val value: Int) {
        companion object {
            fun create(value: Int): MyClass {
                return MyClass(value)
            }
        }
    }
    
    MyClass.create()
  3. 확장 함수

    클래스에 확장 함수를 추가할 수 있다.

    class MyClass {
        companion object {}
    }
    
    fun MyClass.Companion.doSomething() {
        // 확장 함수에서 수행할 작업
    }
  4. 인터페이스 구현

    interface MyInterface {
        fun doSomething()
    }
    
    class MyClass {
        companion object : MyInterface {
            override fun doSomething() {
                // 구현할 작업
            }
        }
    }
  5. 프로퍼티

    클래스에 정적 프로퍼티를 추가할 수 있다. 프로퍼티는 값을 저장하거나 읽어오는 변수이다.

    class MyClass {
        companion object {
            val MY_PROPERTY = "Hello, World!"
        }
    }
  6. 생성자

    companion object ****를 이용하여 생성자를 정의할 수 있다. 이때 생성자는 private으로 선언해야 한다.

    class MyClass private constructor() {
        companion object {
            fun create(): MyClass {
                return MyClass()
            }
        }
    }

object vs companion Object

object

  • 초기화 시점: 실제로 사용될 때 initialized 된다. 실제로 내부 함수에 접근해야 init 블럭이 호출된다.
  • thread-safe

companion object

  • 초기화 시점: 해당 클래스가 로드될 때 initialized 된다.
  • 매번 생성할 때 마다 객체의 주소값을 다르다.
    .
    .
    .

참고
https://medium.com/mindorks/kotlin-object-vs-companion-object-a1907c76a2af
https://nuritech.tistory.com/18

profile
yesjm's second brain

0개의 댓글