ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kotlin] getter/setter 를 만들지 말자
    Kotlin 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는 만들지 않는것이 좋을것 같다.

    반응형

    댓글

Designed by Tistory.