Kotlin의 object 및 companion object 와 Java의 static 의 차이점

곽의진·2023년 10월 18일
1

1. static (Java)

정의: Java에서, static은 '클래스 레벨'에서 변수나 메서드를 정의할 때 사용되는 수식어입니다.

특징:

  • 메모리: static 멤버는 클래스가 메모리에 로드될 때 초기화됩니다. 그 결과, 클래스의 모든 인스턴스가 공유하는 하나의 메모리 위치에 존재합니다.
  • 접근: 클래스 인스턴스 없이도 접근이 가능합니다.
  • 제한: Java에서는 static 클래스를 정의할 수 없습니다. 오직 변수, 메서드, 중첩된 내부 클래스만 static으로 선언될 수 있습니다.
public class Example {
    public static int a = 10;
    
    public static void staticMethod() {
        System.out.println("staticMethod 입니다");
    }
}

2. object (Kotlin)

정의: object는 Kotlin에서 싱글턴 패턴을 직접 구현하는 키워드입니다. 이는 특정 클래스의 단 하나의 인스턴스만을 생성하고 사용하고자 할 때 사용됩니다.

특징:

  • 메모리: object는 첫 접근 시점에 생성되며, 프로그램의 생명주기 동안 그 인스턴스는 유지됩니다.
  • 생성자: 별도의 생성자를 정의할 수 없습니다. 즉, object는 파라미터를 가진 생성자를 갖지 않습니다.
  • 확장: object는 다른 클래스나 인터페이스를 상속하거나 구현할 수 있습니다.
  • Object expressions and declarations: object는 객체 선언, 익명 객체로 정의될 수 있습니다. Object expressions and declarations | Kotlin
object KotlinSingleton {
    val singletonVar: Int = 10
    
    fun singletonMethod() {
        println("This is inside a singleton object.")
    }
}

3. companion object (Kotlin)

정의: companion object는 Kotlin 클래스 내부에서 '클래스 레벨'의 함수나 변수를 정의하기 위해 사용됩니다.

특징:

  • 메모리: companion object의 멤버들은 해당 클래스의 인스턴스 없이 접근 가능합니다. 이는 Java의 static과 비슷한 역할을 합니다.
  • 명명: 기본적으로 Companion이라는 이름을 갖지만, 필요에 따라 다른 이름을 지정할 수 있습니다.
  • 확장: companion object는 다른 클래스나 인터페이스를 상속하거나 구현할 수 있습니다.
  • 디컴파일: 디컴파일시에 Companion이라는 static 중첩 클래스의 인스턴스가 생성되는 것이기 때문에 java의 static 변수, 함수와는 엄연히 다릅니다.
class KotlinExample {
    companion object {
        val companionVar: Int = 10
        
        fun companionMethod() {
            println("This is inside a companion object.")
        }
    }
}

// 디컴파일

public final class KotlinExample {
   @NotNull
   private static final int companionVar = 10;
   @NotNull
   public static final KotlinExample.Companion Companion = new KotlinExample.Companion((DefaultConstructorMarker)null);

   public static final class Companion {
      @NotNull
      public final String getcompanionVar() {
         return User.companionVar;
      }

      public final void companionMethod() {
         println("This is inside a companion object.");
      }

      private Companion() {
      }
      
      // $FF: synthetic method
      public Companion(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
   }
}

✅ 결론

Java의 static은 클래스 레벨의 변수나 메서드를 위해 사용되며, Kotlin에서는 companion object로 동일한 기능을 수행한다고 보시면 됩니다. 다만 **companion object****static**과 달리 객체로써 생성이 된다는 것 입니다. 그렇기에 @JvmField, @JvmStatic 다음과 같은 어노테이션을 통해 자바의 static 변수와 같이 사용할 수 있습니다.

object는 Kotlin에서 싱글턴 패턴의 구현을 위해 사용되며, 이를 통해 하나의 인스턴스만을 갖는 객체를 생성할 수 있습니다. → 참고: 불필요한 객체 생성의 피해

profile
Android Developer

0개의 댓글