안드로이드 New->Fragment 로 프래그먼트를 생성해보면,
companion object{
@JvmStatic
fun newInstance(){
}
}
이렇게 newInstance함수를 자동으로 만들어주는데, @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)가 선언 된 것이 보인다!!!