본문 바로가기

지식쌓기

kotlin @JvmField

자바코드를 kotlin 으로 변환시키다 보면

@JvmField annotation 이 붙는게 있고 안붙는게 있고 그러하다

고럼 @JvmField 이건 머하는 놈인가. 

알아보자

 

api 정의를 기본적으로 보믄.. 

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-jvm-field/index.html

@Target([AnnotationTarget.FIELD]) annotation class JvmField
Instructs the Kotlin compiler not to generate getters/setters for this property and expose it as a field.

저거 쓰면 코틀린 컴파일러가 getter / setter 를 안만들어 준댄다 

 

고럼 여러 케이스로 살펴보자

1. 

	val a = 1

디컴파일

	private final int a = 1;
   
	public final int getA() {
		return this.a;
	}

val 은 immutable 한 변수 정의 이기 때문에 set은 못한다. 

그래서 변수에 final 이 붙고

getter 함수만 자동으로 생성되고 캡슐화 되어 private 변수로 선언되었다. 

 

2. 

1번에 @JvmField 를 붙여보자

	@JvmField
	val a = 1

디컴파일

	@JvmField
	public final int a = 1;

@JvmField붙었으니 위에서 자동으로 만들어주던 getter 함수는 생성되지 않는다.

접근제한자는 public 으로 붙었고 val 이기 때문에 final이 붙었다. 

 

3. 

	var b = 0

디컴파일 

	private int b;
	
	public final int getB() {
		return this.b;
	}

	public final void setB(int var1) {
		this.b = var1;
	}

var이기 때문에 mutable 한 변수이다.

그리고 getter/setter 함수가 모두 생성되었다. 

캡슐화 되어 private이 붙었다.

 

4. 

3번에 @JvmField 를 붙여보자

	@JvmField
	var b = 0

디컴파일, 이쯤대면 디컴파일 결과가 예상되리라...

	@JvmField
	public int b;

@JvmField 가 붙었으니 getter/setter 함수는 생성되지 않는다.

그리고 private정의를 안했으니 public 접근제한자가 붙었다. mutable하니 final은 붙지 않았다.

 

5.

고럼 private을 붙여보자

따로하기 구찮으니 val, var 두개 같이 

(간단한걸 너무 파는것 같은 느낌적인 느낌이 들지만 이왕 쓰기시작한거..)

	private val c = 0
	private var d = 0

디컴파일

	private final int c;
	private int d;

@JvmField 를 안적었으니까 getter/setter 가 자동으로 생성되어야 하지만 private 변수라 생성되지 않는다. 

왜 private이니까!! 

그래서 고럼 @JvmField 를 붙일수도 없다!! 

붙이면 에러난다~~!!

 

따라서 @JvmField 는 변수의 getter/setter 만들어 노출할지, 직접 접근할지 따라서 정의하면 되지 싶다.

하지만 이거도 다 java랑 kotlin이랑 섞어 써서 그른거...

다 kotlin으로 짜면 getter/setter 쓸일이.. 

태그