Person
객체를 구현해 보자.
name
은 변경 불가age
는 자연수여야 함public class JavaPerson {
private final String name;
private int age;
public JavaPerson(String name, int age) {
if (age <= 0) {
throw new IllegalArgumentException(String.format("나이는 %s일 수 없습니다", age));
}
this.name = name;
this.age = age;
}
public JavaPerson(String name) {
this(name, 1);
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isAdult() {
return this.age >= 20;
}
}
JavaPerson
과 똑같이 동작하는Person
객체를 구현해 보자.class Person(
val name: String,
var age: Int
) {
init {
if (age <= 0) {
throw IllegalArgumentException("나이는 ${age}일 수 없습니다.")
}
}
constructor(name: String): this(name, 1)
}
getter
+ setter
getter
, setter
를 자동으로 만들어 준다.person.name
과 같이 getter
로 사용할 수 있다.person.age = 10
이라고 대입하면 setter
처럼 사용 가능하다..name
, .age
로 사용할 수 있다.init
init
(초기화) 블록은 생성자가 호출되는 시점에 호출된다.constructor
this
로 호출해야 한다.{}
블럭으로 body를 가질 수 있다.class Person(
val name: String,
var age: Int = 1
)
Person
이 성인인지 판단하는 isAdult
메서드는 코틀린에서 아래처럼 구현할 수 있다.fun isAdult(): Boolean = age >= 20
getter
로 함수를 마치 프로퍼티처럼 보이게 하는 방식이다.val isAdult: Boolean
get() = this.age >= 20
val isAdult: Boolean
get() {
return this.age >= 20
}
// name을 get할 때 대문자로 바꿔야 하는 경우
class Person(
name: String, // custom getter를 위해 생성자에서 val 키워드 제거
var age: Int = 1
) {
val name: String = name // 주 생성자에서 받은 name을 불변 프로퍼티 name에 바로 대입
get() = field.uppercase()
}
field
예약어
get() = name.uppercase
라고 사용하게 되면 프로퍼티는 name
자체가 getter
를 호출하기에 무한루프에 빠지고 만다.field
를 보이지 않는 field
라 해서 backing field라고 부른다.class Person(
val name: String,
var age: Int = 1
) {
val uppercaseName: String
get() = name.uppercase()
}
name
을 넣을 때 무조건 대문자로 넣어야 하는 요구사항을 구현할 때 custom setter를 사용할 수 있다.var name: String = name
set(value) {
field = value.uppercase()
}
setter
자체를 지양하기 때문에 custom setter도 잘 사용하지 않는다.