자바는 Getter 와 Setter 를 사용하기 위해 Lombok 을 이용하거나 직접 정의해주어야 한다.
코틀린은 자바와 다르게 필드만 만들면 Getter 와 Setter 를 자동으로 만들어주며 필드가 val
인 경우는 setter 를 만들어주지 않는다.
class Person(val name: String, var age: Int)
또한, 생성자에서 프로퍼티를 만들 수 있기에 위와 같이 간단하게 정의할 수 있다.
class Person(val name: String, var age: Int) {
init {
if (age<0) {
throw IllegalArgumentException()
}
}
constructor(name: String): this(name, 1)
}
생성자가 생성되는 시점에 init 이 동작한다.
새로운 생성자는 constructor 를 이용하여 추가하면 된다.
class Person(val name: String, var age: Int)
의 괄호가 primary 생성자이며 이는 필수로 존재해야한다. 하지만 필드가 없는경우는 생략가능하다.
위 constructor 는 부 생성자로써 최종적으로 주 생성자를 this()
로 호출해야한다.
👏 TIP : 코틀린에서는 부생성자보다는 default parameter 를 권장한다.
Converting 같은 경우도 부생성자를 사용할 수 있지만, 정적 팩토리 메소드를 더 추천한다.
val isAdult: Boolean
get() = this.age>= 20
Getter 를 사용한 경우 반환하고싶은 내용을 get()
에 넣어주면 된다.
👏 TIP : 객체의 속성이라면 custom getter 를 사용하고 그렇지 않다면 함수를 사용한다.
// 1
val name: String = name
get() = field.uppercase()
// 2
val uppercaseName: String
get() = this.name.uppercase()
name
을 불렀을 때 대문자로 만들고싶다면 name
이 아닌 1번과 같이 field
로 정의하여야한다. 이를 backing field 라고 부르며 만약 name
으로 정의하면 계속 참조를 하게되어 무한루프에 걸리는 문제가 발생한다.
2번과 같이 this.name
을 사용하고 다른 프로퍼티를 정의할 수 있다.
var name = name
set(value) {
feild = value.uppercase()
}
custom setter 는 위와 같이 정의할 수 있다
👏 TIP : Setter 를 지양하기 때문에 custom setter 를 사용할 일이 거의 없다.