//생성자 앞에 키워드가 없다면 Field.
class Person(firstName: String, lastName: String, age: Int)
//생성자 앞에 var 혹은 val과 같은 키워드가 붙는다면 Property.
class Person(val firstName: String, val lastName: String, val age: Int)
//생성은 둘다 똑같은 방법으로 한다.
val person = Person("k", "H", 345)
val person2 = Person2("k", "H", 345)
//java
//기존의 Java에서의 방식이 이랬다면...
public class PersonJava {
String firstName;
String lastName;
int age;
public PersonJava(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public String getFirstNam() { return firstName; }
public String getLastName() { return lastName; }
public int getAge() { return age; }
public void setFirstNam(String firstName){ this.firstNam = firstName; }
public void setLastName(String lastName){ this.lastName = lastName; }
public void setAge(int age){ this.age = age; }
}
//kotlin
//Kotlin에서는 이 정도면 끝난다.
//프로퍼티로 선언을 하면 내부적으로 알아서 getter, setter를 만들어주기 때문에 보일러플레이트가 사라진다.
class PersonKotlin(var firstName: String, var lastName: String, var age: Int)
필드로 만드는 것과 프로퍼티로 만드는 것의 가장 큰 차이는 내부적으로 getter, setter가 만들어지느냐 아니냐의 차이다.
필드로 생성하면 내부적으로 getter, setter가 만들어지지 않는다.
프로퍼티로 선언을 해야지만 내부적으로 getter, setter가 만들어진다. (val은 자바의 final과 같이 불변이므로 내부적으로 getter는 만들어지지만, setter는 만들어지지 않는다.)
public, private, protected 와 같은 접근제한자도 자바에서와 동일하게 사용할 수 있고, 접근제한자만 잘 사용한다면 보일러플레이트들을 많이 제거할 수 있다.
필드를 하나 선언을 하고 그 바로 밑에 get(), set() 함수를 만들어 커스텀 getter, setter를 만들수도 있다.
//kotlin
class Person {
var name: String = ""
get() = field.toUpperCase() //프로퍼티의 실제 값에 접근해서 가져올때 field. 로 접근한다.
set(value) { //set()으로 받아온 값을 value로 표시.
field = "Name : " + value
}
var name1: String = ""
get() {
field.toUpperCase()
return "aaa"
}
set(value) {
field = "Name : " + value
}
}
var person = Person()
person.name = "test"
println(person.name) //NAME : TEST
person.name1 = "test"
println(person.name1) //aaa