[Kotlin] object와 companion object

강승구·2023년 3월 11일
0

Object

코틀린에서 클래스를 정의하는 키워드는 class이다.
object 키워드는 코틀린에서 클래스 정의하는 방법중 하나로 클래스를 정의하면서 객체를 생성한다.

하지만 object로 클래스를 정의하면 Singleton 패턴이 적용되어 객체가 한번만 생성되도록 한다.
자바에서는 싱글턴 패턴을 적용하기 위해 꽤 많은 코드를 작성해야 하지만 코틀린에서는 object를 사용하면 이런 boilerplate를 작성하지 않아도 된다.

Singleton으로 사용하는 방법 외에도, object 는 익명객체를 생성할 때도 사용되기도 한다.

코틀린에서는 다음과 같이 object를 정의할 수 있다.

object CustomClassByObject {
    var customValue: Int = 20

    fun printCustomValue() {
        println("customValue is : $customValue")
    }
}

위 코드를 자바로 디컴파일하면 다음과 같다.


public final class CustomClassByObject {
   private static int customValue;
   @NotNull
   public static final CustomClassByObject INSTANCE;

   public final int getCustomValue() {
      return customValue;
   }

   public final void setCustomValue(int var1) {
      customValue = var1;
   }

   public final void printCustomValue() {
      System.out.println("customValue is : " + customValue);
   }

   private CustomClassByObject() {
   }

   static {
      CustomClassByObject var0 = new CustomClassByObject();
      INSTANCE = var0;
      customValue = 20;
   }
}

여기서 싱글턴 패턴임을 확인할 수 있다.
1. 클래스의 생성자를 private로 선언하여 외부에서 호출할 수 없도록 제한하고 있다.
2. 클래스의 인스턴스를 담은 변수를 static final로 선언
3. 인스턴스의 생성과 변수의 초기화는 static 초기화 블록에서 수행한다.


Companion Object

인스턴스 생성 없이 클래스의 멤버에 접근 가능
--> 인스턴스에선 접근 불가

class Person(val name: String){
    companion object {
        var age: Int = 20
        var city: String = "Seoul"
    }
}

fun main(){
	val p = Person("kim")
    val age = p.age // ERROR
    
    //인스턴스를 생성하지 않고 프로퍼티에 접근
    val _age = Person.age 
    val city = Person.city
}
profile
강승구

0개의 댓글