Kotlin

[Kotlin] getter/setter 를 만들지 말자

익세망 2022. 1. 23. 13:08

Kotlin의 var과 val은 프로퍼티기 때문에 getter와 setter를 포함하고 있다.

이것이 어떻게 동작되는지 Java로 Decompile 시켜서 확인해보자

 

Java decompile


class Person {
    val gender = "male"
    var age = 3
}

위의 클래스를 Java로 변환시키면

public final class Person {
   @NotNull
   private final String gender = "male";
   private int age = 3;

   @NotNull
   public final String getGender() {
      return this.gender;
   }

   public final int getAge() {
      return this.age;
   }

   public final void setAge(int var1) {
      this.age = var1;
   }
}

이런 형태로 Decompile 되는것을 볼 수 있다.

Java에서 직접 getter와 setter를 만들어 사용 하던것과 완전히 동일하다.

val의 경우는 불변객체이기 때문에 setter가 제공되지 않는다.

 

 

접근제어자


프로퍼티 앞에 붙히는 접근제어자는 getter와 setter의 접근제어자에 해당이 된다.

private getter/setter는 무의미한 동작이기 때문에 생성되지 않는다.

실제 변수의 접근제어자는 무조건 private이다.

class Person {
    private val gender = "male"
    protected var age = 3
}
public final class Person {
   private final String gender = "male";
   private int age = 3;

   protected final int getAge() {
      return this.age;
   }

   protected final void setAge(int var1) {
      this.age = var1;
   }
}

 

 

Custom getter/setter


getter/setter를 custom하게 사용하고 싶은 경우도 있을 것이다.

class Person {
    val gender: String
        get() = "male$age"

    var age: Int = 3
        get() {
            return field + 1
        }
        set(value) {
            field = value + 1
        }
}

gender의 get() = 처럼 한줄로 작성할 수도 있고

get() { } 형태로 블럭으로 작성할 수도 있다.

field는 자기자신을 가르키는 변수이다.

 

Decompile 된 결과는 다음과 같다.

public final class Person {
   private int age = 3;

   private final String getGender() {
      return "male" + this.getAge();
   }

   public final int getAge() {
      return this.age + 1;
   }

   public final void setAge(int value) {
      this.age = value + 1;
   }
}

gender의 값을 확인해보면 custom getter를 만든대로 실행 되는것을 볼 수 있다.

fun main() {
    println(Person().gender) // male4
}

제목에는 getter와 setter를 쓰지 말자고 적었지만

코드를 작성하다보면 사용해야 하는 곳이 있을 수도 있다.

 

하지만 Java를 사용하던 것 처럼 변수만 반환, 설정하는

getter/setter는 만들지 않는것이 좋을것 같다.

반응형