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도 잘 사용하지 않는다.