보뇨 다이어리

코틀린 디자인 패턴 - 관용구와 안티 패턴 (상수 효율적으로 사용하기) 본문

컴퓨터 관련/Kotlin 정보

코틀린 디자인 패턴 - 관용구와 안티 패턴 (상수 효율적으로 사용하기)

보뇨 2024. 12. 17. 16:45
반응형

항상 머리속으로 외우고 넘어갔던 부분인데 정리좀 할겸...

아래와 같이 할경우 Kotlin 프로젝트만 사용할때는 MAX_SIZE_1, MAX_SIZE_2 의 차이점이 느껴지지않는다.

단순한 차이인데 MAX_SIZE_1 을 Java 에서 사용할때는 Chapter08.Companion.MAX_SIZE_1 로 접근하게 되고,

MAX_SIZE_2 을 Java 에서 사용할때는 Chapter08.MAX_SIZE_1 로 접근하게 된다.

그외에 다른 부분이라면 Java 로 변환할때 Companion 바깥쪽에도 getter 가 생긴다는 점이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Chapter08 {
 
    companion object {
        val MAX_SIZE_1 = 3
 
        @JvmStatic
        val MAX_SIZE_2 = 3
 
        const val MAX_SIZE_3 = 3
    }
 
    @Test
    fun valuee() {
        val maxSize = MAX_SIZE_1
        val maxSize2 = MAX_SIZE_2
        val maxSize3 = MAX_SIZE_3
 
        println("$maxSize, $maxSize2, $maxSize3")
    }
}
cs

 

 

아래 코드가 Java 로 변환될때이다.

보면 단순하게 const val 를 선언한것이 가장 깔끔해서 앞으로도 저렇게 사용할꺼같다.

왜냐하면 Java 에서 쓸때는 @JvmStatic 추가없이 동일하게 Chapter08.MAX_SIZE_3 로 사용할수있기때문!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
@Metadata(
   mv = {190},
   k = 1,
   xi = 48,
   d1 = {"\u0000\u0014\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u0002\n\u0002\b\u0002\u0018\u0000 \u00052\u00020\u0001:\u0001\u0005B\u0005¢\u0006\u0002\u0010\u0002J\b\u0010\u0003\u001a\u00020\u0004H\u0007¨\u0006\u0006"},
   d2 = {"Lcom/example/mavenkotlinexample/Chapter08;""""()V""valuee""""Companion""maven-kotlin-example"}
)
public final class Chapter08 {
   @NotNull
   public static final Companion Companion = new Companion((DefaultConstructorMarker)null);
   private static final int MAX_SIZE_1 = 3;
   private static final int MAX_SIZE_2 = 3;
   public static final int MAX_SIZE_3 = 3;
 
   @Test
   public final void valuee() {
      int maxSize = MAX_SIZE_1;
      int maxSize2 = MAX_SIZE_2;
      int maxSize3 = 3;
      String var4 = maxSize + ", " + maxSize2 + ", " + maxSize3;
      System.out.println(var4);
   }
 
   public static final int getMAX_SIZE_2() {
      return Companion.getMAX_SIZE_2();
   }
 
   @Metadata(
      mv = {190},
      k = 1,
      xi = 48,
      d1 = {"\u0000\u0014\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\b\n\u0002\b\u0007\b\u0086\u0003\u0018\u00002\u00020\u0001B\u0007\b\u0002¢\u0006\u0002\u0010\u0002R\u0014\u0010\u0003\u001a\u00020\u0004X\u0086D¢\u0006\b\n\u0000\u001a\u0004\b\u0005\u0010\u0006R\u001c\u0010\u0007\u001a\u00020\u00048\u0006X\u0087D¢\u0006\u000e\n\u0000\u0012\u0004\b\b\u0010\u0002\u001a\u0004\b\t\u0010\u0006R\u000e\u0010\n\u001a\u00020\u0004X\u0086T¢\u0006\u0002\n\u0000¨\u0006\u000b"},
      d2 = {"Lcom/example/mavenkotlinexample/Chapter08$Companion;""""()V""MAX_SIZE_1""""getMAX_SIZE_1""()I""MAX_SIZE_2""getMAX_SIZE_2$annotations""getMAX_SIZE_2""MAX_SIZE_3""maven-kotlin-example"}
   )
   public static final class Companion {
      private Companion() {
      }
 
      public final int getMAX_SIZE_1() {
         return Chapter08.MAX_SIZE_1;
      }
 
      public final int getMAX_SIZE_2() {
         return Chapter08.MAX_SIZE_2;
      }
 
      /** @deprecated */
      // $FF: synthetic method
      @JvmStatic
      public static void getMAX_SIZE_2$annotations() {
      }
 
      // $FF: synthetic method
      public Companion(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}
 
cs
반응형