[Kotlin] 전역 변수

panax·2024년 1월 21일
0

Kotlin

목록 보기
5/5
post-thumbnail

🍠static

자바에서 전역 변수는 static로 선언된다.

반면 코틀린은 static 키워드가 없기 때문에 다른 방법을 사용한다.
코틀린에서 사용하는 방법들에 대해 조사하려 한다.

🍠Top-level property

클래스 없이 파일에 작성하는 변수

// Top-level
val a = "A"

자바 파일로 변환하면 아래와 같다.
파일 이름으로 클래스가 만들어지고 static 변수로 설정된다.

public final class StaticTestKt {
   @NotNull
   private static final String a = "A";

   @NotNull
   public static final String getA() {
      return a;
   }
}

🍠Companion object

클래스에 포함된 형태로 작성하는 변수

// Companion object
class B {
    companion object {
        val b = "B"
    }
}

자바 파일로 변환하면 아래와 같다.
Companion 클래스를 추가로 생성했으며 static 변수로 클래스를 선언했다.
변수에 대한 접근을 Companion 클래스를 통해서만 하게 만들었다.

public final class B {
   @NotNull
   private static final String b = "B";
   @NotNull
   public static final Companion Companion = new Companion((DefaultConstructorMarker)null);

   public static final class Companion {
      @NotNull
      public final String getB() {
         return B.b;
      }

      private Companion() {
      }

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

🍠Object

object 키워드를 사용해서 만든 싱글턴 클래스의 멤버로 작성하는 변수

// object
object C {
    val c = "C"
}

자바 파일로 변환하면 아래와 같다.
일반적인 싱글턴 패턴으로 만들었으며 변수에 대한 접근을 클래스를 통해서만 가능하게 했다.

public final class C {
   @NotNull
   private static final String c;
   @NotNull
   public static final C INSTANCE;

   @NotNull
   public final String getC() {
      return c;
   }

   private C() {
   }

   static {
      C var0 = new C();
      INSTANCE = var0;
      c = "C";
   }
}

🍠차이점

일단 변수를 사용할 때는 다음 차이점이 있다.
a는 변수가 어디에 있는지 알 수 없지만, b, c는 어디에 있는지 알 수 있다.

a
B.b
C.c

자바 코드로 비교하면 다음과 같다. Top-level이 성능에 영향이 가장 적을 것으로 예상된다.

Top-level: 가장 간단한 형태
companion object: 코드도 길고 클래스도 2개를 사용하는 형태
object: Top-level 보다는 복잡하지만 companion object 보다는 간단한 형태

🍠정리

Top-level
클래스와 크게 연관이 없고 독립적으로 사용되는 값. 주로 사용하는 걸 추천

companion object
클래스와 깊게 연관된 경우 사용하지만, 단순히 변수를 선언하는 용도로는 추천하지 않음.
다만 메소드의 경우 companion object를 많이 활용하는 것으로 보임

object
companion object 대신 사용하기 적합
연관된 클래스와 다른 이름을 사용해야 하는 문제가 있음

🍠참고 자료

Kotlin Discussions
Stack overflow

profile
안드로이드 개발자

0개의 댓글