Java & Kotlin

Kotlin @JvmStatic

필자A 2022. 6. 27. 20:30

@JvmStatic 

 

static 하게 운용하고 싶을 때 아래와 같이 작성하면 자바로는 

baz클래스에 static한 값이 생기며 baz안의 Companio. class에 getter setter가 추가됩니다.

class baz {
    companion object {
        var s: Int = 0
    }
}
... decompile
 public final class baz {
     private static int s;
     public static final class Companion {
          public final int getS() {
             return baz.s;
          }

          public final void setS(int var1) {
             baz.s = var1;
          }

          private Companion() {
          }

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

 

bazClass내에서 getter/setter가 생성되었습니다.

class baz {
    companion object {
        @JvmStatic var s: Int = 0
    }
}
...decompile
public final class baz {
   private static int s;
   
   public static final int getS() {
      Companion var10000 = Companion;
      return s;
   }

   public static final void setS(int var0) {
      Companion var10000 = Companion;
      s = var0;
   }

   public static final class Companion {
      /** @deprecated */
      // $FF: synthetic method
      @JvmStatic
      public static void getS$annotations() {
      }

      public final int getS() {
         return baz.s;
      }

      public final void setS(int var1) {
         baz.s = var1;
      }

      private Companion() {
      }

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

 

이는 Java 확장자 파일에서 baz.s를 접근할 때 차이가 있습니다.

@JvmStatic이 없을시 baz내의 companion class(static)의 메서드를 통해 s에 접근이 가능합니다.

baz.companion.getS();

 

@JvmStatic이 있을경우

baz내에 getter/ setter가 존재해 

baz.getS(); 같이 접근이 가능합니다.

반응형