코틀린 기본 문법 중 프로퍼티에 대한 이해를 확실하게 하고, 설명할 수 있을 정도로 이해하기 위해 글을 작성하게 되었습니다.
객체지향 프로그래밍에는 캡슐화라는 개념이 있습니다.
데이터와, 그 데이터를 처리하는 메소드를 묶어 클래스 안에 보호하는 것입니다.
이를 위해 내부 데이터는 private
으로 접근할 수 없게 하고, public
으로 선언된 메서드를 통해 접근했었습니다.
자바에서는 이를 구현하기 위의 아래 방식을 사용했었습니다.
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의 보일러 플레이트 코드를 증가시켰습니다.
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를 디컴파일 해보면, 다음과 같은 자바 코드를 볼 수 있습니다.
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가 만들어지지 않습니다.
또한 접근자를 커스텀 할 수도 있습니다.
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를 계산하여 호출하게 됩니다.
var date: String
get() = this.toString()
set(value) {
dateToString(value)
}
마찬가지로 setter에 setDataFromString이라는 어떠한 데이터를 가져와 String으로 Parsing하는 메서드를 통해 호출할 때 마다 할당할 수 있습니다.
class Person{
private var cardNumber: String = "121-121-1"
private get() = field
}
class Person{
var cardNumber: String = "121-121-1"
private set
}
위와 같이 접근자를 private으로 선언할 수도 있습니다.
코틀린의 Property말고 스타벅스의 프라푸치노 부탁합니다