[Kotlin] Property

Choi Sang Rok·2022년 6월 7일
2

Kotlin

목록 보기
1/6

코틀린 기본 문법 중 프로퍼티에 대한 이해를 확실하게 하고, 설명할 수 있을 정도로 이해하기 위해 글을 작성하게 되었습니다.


🧴캡슐화


객체지향 프로그래밍에는 캡슐화라는 개념이 있습니다.
데이터와, 그 데이터를 처리하는 메소드를 묶어 클래스 안에 보호하는 것입니다.
이를 위해 내부 데이터는 private으로 접근할 수 없게 하고, public으로 선언된 메서드를 통해 접근했었습니다.


☕At Java


자바에서는 이를 구현하기 위의 아래 방식을 사용했었습니다.

class Person {
    private String name;

    Person() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

객체의 상태를 나타내는 데이터를 Field, 객체가 하는 행동을 Method라고 하였습니다. 또한 캡슐화를 위해 getter와 setter 메서드를 작성하여 데이터에 접근하도록 하였습니다.

하지만 위 방식은 필드가 많아짐에 따라 getter와 setter의 보일러 플레이트 코드를 증가시켰습니다.


🙋‍♂️코틀린의 Property란?


  • field + getter + setter == property
class Person {
    var name: String = ""
}

코틀린에서는, 다음과 같이 변수를 선언하기만 하여도 내부적으로 getter와 setter를 구현합니다. 이를 함께 불러 property라고 부릅니다.

public final class Person {
   @NotNull
   private String name = "";

   @NotNull
   public final String getName() {
      return this.name;
   }

   public final void setName(@NotNull String var1) {
      Intrinsics.checkNotNullParameter(var1, "<set-?>");
      this.name = var1;
   }
}

코틀린에서 작성된 Person를 디컴파일 해보면, 다음과 같은 자바 코드를 볼 수 있습니다.


🙋‍♂️getter와 setter


var <propertyName>[: <PropertyType>] [= <property_initializer>]
    [<getter>]
    [<setter>]

property를 선언하는 문법입니다. getter와 setter를 따로 선언하지 않아도, getter와 setter가 내장되어 있습니다.

class Person {
    var name: String = ""
        get() = field
        set(value){ field = value }
}

만약 이를 직접 구현한다면 이렇게 생겼습니다. field라는 식별자를 통해 데이터에 접근할 수 있고, 매개변수를 value 등으로 제공할 수 있습니다.

field 식별자는, backing field입니다. 적어도 하나 이상의 기본 접근자를 사용할 때 만들어집니다.

val isEmpty: Boolean
    get() = this.size == 0

이런 상황에서는 field가 만들어지지 않습니다.


또한 접근자를 커스텀 할 수도 있습니다.

get() 응용

class Person(val height: Int, val weight: Int) {
    val bmi: Int 
        get() = this.weight / (this.height * this.height)
}

area라는 변수는, width x height의 값을 가지고 있어야 합니다. 만약 코드를 이처럼 작성하게 된다면, area를 호출할 때 마다, width x height를 계산하여 호출하게 됩니다.

set() 응용

var date: String
    get() = this.toString()
    set(value) {
        dateToString(value)
    }

마찬가지로 setter에 setDataFromString이라는 어떠한 데이터를 가져와 String으로 Parsing하는 메서드를 통해 호출할 때 마다 할당할 수 있습니다.

private 접근자

class Person{
    private var cardNumber: String = "121-121-1"
        private get() = field
}
class Person{
    var cardNumber: String = "121-121-1"
        private set
}

위와 같이 접근자를 private으로 선언할 수도 있습니다.

  • getter을 private으로 선언했다면, 변수도 private 해야합니다. 외부에서 참조하지 않고 내부에서 사용될 수 있습니다.
  • setter를 private으로 선언했다면, 외부에서 값을 가져올 순 있지만, 할당할 수는 없게 됩니다.

참고문서
https://kotlinlang.org/docs/properties.html

profile
android_developer

4개의 댓글

comment-user-thumbnail
2022년 6월 7일

코틀린의 Property말고 스타벅스의 프라푸치노 부탁합니다

답글 달기
comment-user-thumbnail
2022년 6월 7일

26세 / 남 / 무직 백수 / evergreen_tree 메모...

답글 달기
comment-user-thumbnail
2022년 6월 9일

요즘.... 이가 많이 빠져서 틀니를 해야 하ㄴ는데 .....
코틀린...... 이라는 틀니....... 괜찮은것 같네요...
젊은사랆이... 벌써.... 틀리를 준비한다니..... 정보 감사합니다....

답글 달기
comment-user-thumbnail
2022년 6월 9일

나만 알고 싶은 블로그였는데 너무 hot 해졌네요.. 예전에는 답글도 달아주시더니 요즘 너무 뜨셨다고 변하신것 같습니다... 초심 찾으세요... 벼는 익을수록 고개를 숙인답니다...

답글 달기