@JvmStatic가 무엇일까?

상상코딩·2022년 3월 15일
2

안드로이드

목록 보기
11/21

안드로이드 New->Fragment 로 프래그먼트를 생성해보면,

companion object{
	@JvmStatic
    fun newInstance(){
    }
}

이렇게 newInstance함수를 자동으로 만들어주는데, @JvmStatic이라는 어노테이션을 볼 수 있다.

@JvmStatic가 뭘까?

결론: Java의 static 처럼 쓰기 위함.

설명,,,

companion object는 자바의 static과 유사하게 쓰이지만, 사실 다르다.

class Bar {
    companion object {
        var barSize : Int = 0
    }
}

이 함수를 자바로 변환해보면

public final class Bar {
   private static int barSize;
   public static final class Companion {
      public final int getBarSize() {
         return Bar.barSize;
      }
      public final void setBarSize(int var1) {
         Bar.barSize = var1;
      }
   }
}

이렇게 Bar 클래스 내부에 변수가 있고, 이 변수에 대한 getter/setter는 Companion 클래스에 존재하는 것을 볼 수 있다.

뒤에 어노테이션이 붙은 경우를 보면 더 확실히 알겠지만,,,!!!!
코틀린에서만 쓸 때 말고, 자바에서 해당 변수/함수를 호출할 때 차이를 느끼게 된다.
자바에서,,,
getBarSize()함수는 Companion 클래스 내부의 함수이므로
Bar.getBarSize() 같이 접근 할 수 없고, Bar.Companion.getBarSize()와 같이 접근해야한다.


그러나,

class Bar {
    companion object {
        @JvmStatic var barSize : Int = 0
    }
}

이렇게 @JvmStatic 어노테이션을 써준다면?

public final class Bar {
   private static int barSize;
   public static final int getBarSize() {
      return barSize;
   }

   public static final void setBarSize(int var0) {
      barSize = var0;
   }

   public static final class Companion {
      public final int getBarSize() {
         return Bar.barSize;
      }
      public final void setBarSize(int var1) {
         Bar.barSize = var1;
      }
   }
}

이렇게 Companion 클래스 내부 뿐만 아니라 클래스 바로 내부에도 같은 함수(getter,setter)가 선언 된 것이 보인다!!!


profile
히히낙낙

0개의 댓글